Изменение капитализации имен файлов в Git
Я пытаюсь переименовать файл, чтобы иметь другую заглавную копию от того, что у него было до этого:
git mv src/collision/b2AABB.js src/collision/B2AABB.js
fatal: destination exists, source=src/collision/b2AABB.js, destination=src/collision/B2AABB.js
Как вы можете видеть, git подбрасывает это. Я попытался переименовать, используя только старую старую команду mv
, но git не забирает переименование (как переименование или новый файл без следа).
Как я могу изменить файл, чтобы иметь другую капитализацию с тем же именем? Я нахожусь в Mac OS X 10.7.3 с git 1.7.9.1, используя zsh 4.3.15.
Ответы
Ответ 1
Запуск git 2.0.1 (25 июня 2014 года), git mv
будет работать только на нечувствительной к регистру ОС.
Смотрите commit baa37bf Дэвид Тернер (dturner-tw
)
mv
: разрешить переименование в случае исправления на нечувствительных к регистру файловых системах
"git mv hello.txt Hello.txt
" на файловой системе, нечувствительной к регистру, всегда вызывает ошибку "destination already exists
", поскольку эти два имени относятся к одному и тому же пути с точки зрения файловой системы и требуют от пользователя "--force
", когда исправляя случай пути, записанного в индексе, и в следующем фиксации.
Обнаружьте этот случай и разрешите его, не требуя "--force
".
git mv hello.txt Hello.txt
просто работает (нет --force
требуется больше).
Ответ 2
Учитывая приведенные выше ответы, вы можете заставить его работать с одной командой с помощью "--force":
git mv --force myfile MyFile
Ответ 3
Иногда вы хотите изменить заглавные буквы множества файлов в нечувствительной к регистру файловой системе (например, в OS X или Windows). Выполнение команд git mv
будет быстро утомлять, чтобы упростить задачу, вот что я делаю:
- Переместите все файлы за пределы каталога, чтобы, скажем, рабочий стол.
- Сделать
git add. -A
git add. -A
удалить все файлы. - Переименуйте все файлы на рабочем столе в правильную прописную букву.
- Переместите все файлы обратно в исходный каталог.
- Сделать
git add.
Git должен видеть, что файлы переименованы.
Теперь вы можете сделать коммит, сказав, что вы изменили капитализацию файла.
Ответ 4
Имена файлов под OS X не чувствительны к регистру (по умолчанию). Это скорее проблема ОС, чем проблема git. Если вы удаляете и повторно добавляете файл, вы должны получить то, что хотите, или переименовать его на что-то еще, а затем переименовать его.
Ответ 5
Как OP о "Изменение заглавной буквы имен файлов в Git":
Если вы пытаетесь изменить "Капитализация имени файла" в своем проекте, вам не нужно force переименовать его из git. IMO, я предпочел бы изменить "Капитализацию" из моего IDE/редактора и убедиться, что я правильно настроил git, чтобы забрать переименование.
По умолчанию шаблон git установлен для игнорирования case (git нечувствительный к регистру). Чтобы убедиться, что для шаблона по умолчанию используется --get
, чтобы получить значение для указанного ключа. Используйте --local
и --global
, чтобы указать git, следует ли выбрать значение ключа конфигурации из локальной конфигурации git repo или глобальной. Например, если вы хотите найти глобальный ключ core.ignorecase
:
git config --global --get core.ignorecase
Если это возвращает true
, обязательно установите его как:
git config --global core.ignorecase false
(убедитесь, что у вас есть соответствующие разрешения для изменения глобального)
И там у вас это есть, теперь ваш git не будет игнорировать капитализацию и рассматривать их как изменения.
В качестве предположения, если вы работаете над многоязычными проектами, и вы чувствуете, что не все проекты должны рассматриваться как чувствительные к регистру с помощью git, просто обновите локальный core.ignorecase
Ответ 6
Вы можете открыть каталог ".git", а затем отредактировать файл "config". В разделе "[core]" установлено "ignorecase = true", и вы закончили;)
Ответ 7
Этот фрагмент python будет git mv --force
всех файлов в каталоге, которые будут содержать строчные буквы, например: foo/Bar.js станет foo/bar.js через git mv foo/Bar.js foo/bar.js --force
Измените его по своему вкусу, просто подумайте, что я бы разделил:)
import os
import re
searchDir = 'c:/someRepo'
exclude = ['.git', 'node_modules','bin']
os.chdir(searchDir)
for root, dirs, files in os.walk(searchDir):
dirs[:] = [d for d in dirs if d not in exclude]
for f in files:
if re.match(r'[A-Z]', f):
fullPath = os.path.join(root, f)
fullPathLower = os.path.join(root, f[0].lower() + f[1:])
command = 'git mv --force ' + fullPath + ' ' + fullPathLower
print(command)
os.system(command)
Ответ 8
Настроить файлы git mv
на строчные буквы в macOS:
for f in *; do git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
Он будет записывать все файлы в папку.