Изменение капитализации имен файлов в 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 будет быстро утомлять, чтобы упростить задачу, вот что я делаю:

  1. Переместите все файлы за пределы каталога, чтобы, скажем, рабочий стол.
  2. Сделать git add. -A git add. -A удалить все файлы.
  3. Переименуйте все файлы на рабочем столе в правильную прописную букву.
  4. Переместите все файлы обратно в исходный каталог.
  5. Сделать 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

Он будет записывать все файлы в папку.