Изменить регистр файла в Windows?

209

В нашей базе кода, управляемой git, есть пара файлов, которые я бы хотел переименовать. В частности, я просто хочу изменить регистр файла, чтобы он sourceCode.javaстал SourceCode.java, например. Загвоздка: я нахожусь на коробке Windows, и файловая система думает, что это - то же самое имя файла.

Как я могу заставить Windows и Git распознать это изменение и зарегистрировать его?

Electrons_Ahoy
источник
3
Начиная с Git 2.0.1+ (июнь 2014 г.), простой git mvдолжен работать ( stackoverflow.com/a/24979063/6309 ). Даже на Windows.
VonC

Ответы:

337

Посмотрите здесь для получения дополнительных советов о том, как это сделать:

Как заставить git игнорировать изменения в случае?

Или:

git mv -f name.java Name.java
Игорь Зевака
источник
8
Кроме того, это не работает на файловой системе FAT. Я несу код проекта на флеш-накопителе, и изменения в кейсах - настоящая боль.
ASM
1
Это не сработало для меня в системе NTFS и Windows 10
Roboblob
1
Это, безусловно, правильный способ сделать это, но, если вам нужно переименовать много файлов, это может быть утомительно. Если вы уже каким-то образом переименовали их в файловой системе, и вы просто хотите зафиксировать эти изменения, вы можете переименовать некоторую родительскую папку, сделать git addиз этой недавно переименованной папки НЕ ЗАПИСАТЬ, изменить имя папки обратно на то, что должно быть , git addон снова и затем совершить.
Okonomiyaki3000
Работает на NTFS и Windows 7.
Ганс Голдман
Возможно ли сделать это навалом? например, с Get-ChildItem '.' | Rename-Item {$_.Name.ToLowerCase()}
PowerShell
49

Если вы находитесь в файловой системе FAT, ваш единственный выбор - сделать двухэтапное переименование:

  1. Переименовать sourceCode.javaвanything.you.like
  2. Переименовать anything.you.likeвSourceCode.java

В те времена, когда мы использовали Perforce, у нас была именно эта проблема, и это было единственное решение, которое мы могли придумать.

ChrisF
источник
13
Просто примечание для других: нет необходимости совершать промежуточные действия, но необходимо добавить в индекс, чтобы git заметил изменения
arberg
29

Следующие шаги позволили мне изменить регистр в Windows:

  • Добавить ignorecase = falseк [core]в .git/config;
  • Переместите файлы, которые вы собираетесь переименовать, из каталога вашего проекта;
  • Добавьте удаления в индекс;
  • Переместите все файлы обратно в их исходное местоположение и измените регистр файлов и / или каталогов;
  • Добавить все «новые» файлы в индекс;
  • Удалить ignorecase = falseдобавлено на первом шаге.

Таким образом, у вас есть один коммит, который содержит переименование, и это позволяет легко изменить, например, весь каталог.

Питер ван Гинкель
источник
5
Сделайте это для глобальных и локальных настроек: $ gti config --global core.ignorecase false $ gti config core.ignorecase false
Роман Иванов
6

Быть осторожен. Это может привести к изменениям, которые невозможно объединить. Git запутывается при слиянии в Windows, потому что не может решить, являются ли старое имя в верхнем регистре и новое имя в нижнем регистре одним и тем же файлом или нет (для Git это не так, но для файловой системы они есть). Чтобы объединить, вы должны сделать некоторые ручные обходные пути, такие как удаление файлов перед объединением.

Смотрите Git rebase с файлами с тем же именем, но с другим регистром

Я не уверен, что эта проблема хуже, чем наличие файла с нетрадиционными именами в вашем проекте навсегда, но стоит знать о том, есть ли много пользователей с большим количеством веток, которые в конечном итоге нужно будет объединить.

ОРГ
источник
По возможности следует всегда избегать именованных файлов в средних и крупных проектах из-за проблем, возникающих при разработке для нескольких платформ (задержка с исправлением чего-либо подобного до более позднего времени сделает проблемы из-за исправления более серьезными). Иногда вы разрабатываете для Windows, но также необходимо выполнить сборку Linux, и включение, которое будет работать на Windows, приводит к сбою сборки на Linux.
Гриффорк
3

На мой взгляд, один простой способ отсутствует. Вы можете сделать это для одного файла, определенного каталога или даже всего хранилища:

git rm --cached <file name or directory>
git add <file name or directory>

Если вы хотите повлиять также на подкаталоги, вы должны использовать -rфлаг:

git rm -r --cached <directory>
git add <directory>
Nils-O-MAT
источник
Действительно самый простой.
Рану
Это теряет всю историю файла, так как он установлен git как совершенно новый.
Алехандро
@ Alejandro То, что вы говорите, неверно. Я только что проверил и git распознал переименование без проблем. Как и в других случаях, файл показывается как удаленный / новый в индексе, но при фиксации git замечает, что он только что был переименован.
Nils-o-mat