Изменение заглавных букв в Git

473

Я пытаюсь переименовать файл, чтобы он стал заглавным:

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 v10.7.3 (Lion) с Git 1.7.9.1 с использованием оболочки Z (zsh) 4.3.15.

knpwrs
источник
49
это потому, что файловая система osx по умолчанию сохраняет регистр и нечувствительна к регистру. Вы можете просто продолжить в два этапа:git mv myfile foo; git mv foo MyFile
tonio
16
Получил работу с "git mv --force myfile MyFile".
Марчелло де Сэйлс
7
Начиная с git 2.0.1 (июнь 2014 г.), git mv hello.txt Hello.txtбудет работать с регистронезависимой ОС. Смотрите мой ответ ниже
VonC
1
Связывание stackoverflow.com/questions/1793735/…
Олег Эстехин

Ответы:

554

Начиная с Git 2.0.1 (25 июня 2014 г.), программа git mvбудет работать только с нечувствительной к регистру ОС .

См совершить baa37bf по Дэвид Тернер ( dturner-tw) .

mv: разрешить переименование для исправления регистра в нечувствительных к регистру файловых системах

« git mv hello.txt Hello.txt» в файловой системе, нечувствительной к регистру, всегда вызывает « destination already exists» ошибку, поскольку эти два имени относятся к одному и тому же пути с точки зрения файловой системы и требуют от пользователя указания « --force» при исправлении регистра пути, записанного в индексе и в следующий коммит

Обнаружить этот случай и разрешить его, не требуя " --force".

git mv hello.txt Hello.txtпросто работает (больше не --forceтребуется).


Другая альтернатива:

git config --global core.ignorecase false

И переименуйте файл напрямую; Git добавить и зафиксировать.

VonC
источник
2
FWIW это регресс или никогда не работал на Windows. Я на 2.15.1.windows.2 и все еще должен использовать
--force
1
@ Adowrath Отличная новость!
VonC
Будет ли это работать и для заглавных букв расширений? Например, если у файла есть имя image.TXT, и я хочу переименовать его в image.txt
siluveru kiran kumar
@siluverukirankumar Да. У вас были проблемы с этим вариантом использования?
VonC
1
Получил это, чтобы работать на окнах, выполнив эту команду иgit config core.ignorecase false
Джон Таргариен
453

Принимая во внимание ответ жаворонка , вы можете заставить его работать с одной командой с --force:

 git mv --force myfile MyFile
Марчелло де Сэйлс
источник
3
Если вы используете нечувствительную к регистру файловую систему и получаете фатальную ошибку «Неверный аргумент», попробуйте выполнить следующие действия: stackoverflow.com/questions/3011625/…
Леви
1
Хотя это правильный ответ для первого шага, как перейти к другой ветви под Mac OS X, когда другая ветвь имеет старую заглавную букву. Я получаю **** ошибка: Следующие неотслеживаемые файлы рабочего дерева будет переписан на кассе: ****
TJChambers
1
Это не удалось при Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
коммите
98

Иногда вы хотите изменить заглавные буквы многих имен файлов в нечувствительной к регистру файловой системе (например, в OS X или Windows). Выполнение git mvкоманд быстро устает. Чтобы сделать вещи немного проще, это то, что я делаю:

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

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

MrHus
источник
3
Это происходит за счет всей истории файлов, которые вы перемещаете и выводите, верно? Я предполагаю, что у git mv --force этого недостатка нет.
LOAS
12
Нет, это не удалит всю историю. Обратите внимание, что между двумя добавлениями нет коммита.
Майкл Л Перри
63

Имена файлов в OS X не чувствительны к регистру (по умолчанию). Это скорее проблема ОС, чем проблема Git. Если вы удалите и прочитаете файл, вы должны получить то, что хотите, или переименовать его в другое, а затем переименовать обратно.

larsks
источник
2
Вы также можете сделать git cloneрепозиторий в системе Linux, переименовать файлы и зафиксировать их только для этой ситуации (если у вас есть система Linux под рукой).
Гитаарик
4
На самом деле, файловые системы в OS X могут быть чувствительны к регистру, вы можете настроить это при установке. Как проверить, является ли раздел OS X чувствительным к регистру
Flimm
2
... отсюда "(по умолчанию)" в ответе.
Жаворонки
4
Для подтверждения вы можете использовать git rm --cached fileorfolderдля удаления файла или папки из git, не удаляя файл или папку из файловой системы. Затем вы можете просто добавить файл или папку с помощью git add fileorfolder.
Кас
32

Набор ignorecaseдля falseв мерзавца конфигурации

Как и в оригинальном посте, «Изменение заглавных букв в Git»:

Если вы пытаетесь изменить прописное имя файла в своем проекте, вам не нужно принудительно переименовывать его из Git. IMO, я бы предпочел изменить заглавную букву с моего IDE / редактора и убедиться, что я правильно настроил Git для получения переименования.

По умолчанию шаблон Git настроен на игнорирование регистра (Git без учета регистра). Чтобы убедиться, что у вас есть шаблон по умолчанию, используйте --getдля получения значения для указанного ключа. Используйте --localи, --globalчтобы указать Git, выбрать ли значение ключа конфигурации из локальной конфигурации Git-репозитория или глобальной. Например, если вы хотите найти свой глобальный ключ core.ignorecase:

git config --global --get core.ignorecase

Если это возвращается true, убедитесь, что установили его как:

git config --global core.ignorecase false

(Убедитесь, что у вас есть соответствующие разрешения для изменения глобальных настроек.) И вот, у вас есть это; теперь ваша установка Git не будет игнорировать заглавные буквы и рассматривать их как изменения.

В качестве предложения, если вы работаете над многоязычными проектами и считаете, что не все проекты должны обрабатываться Git с учетом регистра, просто обновите локальный core.ignorecaseфайл.

сегментированные
источник
6
И если git config --global --get core.ignorecaseничего не вернет. Это true?? потому что после того, как я установил его, falseон возвращает false (Windows 10)
fralbo
И, кажется, не работает, как ожидалось. Я имею в виду, что настольный клиент видит изменение, но после фиксации / синхронизации имя файла остается неизменным в сети!
Фральбо
Работал для меня (и лучше для нескольких файлов, чем с помощью git mv). Я также предполагаю, что по умолчанию он считается истинным (то есть он игнорирует регистр). Либо так, либо он соответствует политике ОС для имени файла.
Джерри
Это ответ. Просто использовал это.
Дейв Эверитт
1
Это должен быть выбранный ответ
Дейв Эверитт
7

Вы можете открыть каталог «.git», а затем отредактировать файл «config». Под набором «[core]» установите «ignorecase = true», и все готово;)

Деян Добромиров
источник
кажется, что это должно быть изменено на false, чтобы git учитывал регистр?
Джонатан
1

Чтобы git mvвыполнить массовую загрузку файлов в нижнем регистре на macOS:

for f in *; do git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done

Он будет в нижнем регистре все файлы в папке.

softarn
источник
1

Этот фрагмент кода 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)
blented
источник
-1

Рабочий пример:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png
Даниэль Батиста
источник
2
Ваш ответ не решает оригинальный вопрос. Вы в низком корпусе расширения
Таво
Я ищу именно это, но для 500 изображений. я хочу переименовать ./src/images/TESTIMAGE.png в ./src/images/testimage.png на git
Мохак Лондэ