Изменение заглавных букв в 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.


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

Ответы:


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 добавить и зафиксировать.


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 должен видеть, что файлы переименованы.

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


3
Это происходит за счет всей истории файлов, которые вы перемещаете и выводите, верно? Я предполагаю, что у git mv --force этого недостатка нет.
— LOAS

12
Нет, это не удалит всю историю. Обратите внимание, что между двумя добавлениями нет коммита.
— Майкл Л Перри

63

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


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

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


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)

-1

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

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png

2
Ваш ответ не решает оригинальный вопрос. Вы в низком корпусе расширения
— Таво

Я ищу именно это, но для 500 изображений. я хочу переименовать ./src/images/TESTIMAGE.png в ./src/images/testimage.png на git
— Мохак Лондэ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.