git merge завершается неудачно с «Неотслеживаемым файлом рабочего дерева» при изменении регистра - PullRequest
6 голосов
/ 19 июля 2011

В Mac OS X у меня есть две ветви - скажем, A и B - и я хочу объединить A в B. Когда я пытаюсь сделать git merge A на B, я получаю:

error: Untracked working tree file 'path/file.php' would be overwritten by merge.  Aborting

Это вызвано тем, что некоторые изменения в A переименовали файл - то есть B имеет файл path/File.php, в то время как A переименовал его в path/file.php.Поскольку файловая система Mac OS X нечувствительна к регистру, это, вероятно, сбивает с толку git.Есть ли способ заставить git правильно выполнить слияние?

Обновление: для пояснения, в ветви B нет никаких незафиксированных изменений, и рассматриваемый файл отслеживается в обеих ветвях (под разными именами, конечно).

Ответы [ 4 ]

4 голосов
/ 16 сентября 2015

ОК, покопавшись весь день, вот решение, которое я нашел:

========== Ситуация ==========

Я занимаюсь разработкой на своей ветке "Хотдог"

Мой сотрудник отправил свою работу в нашу главную ветку, включая файл с именем "Hamburgersrule"

Я объединяю мастера с моей веткой Hotdog.

Мой сотрудник меняет "Hamburgersrule" на "HamburgersRule" и подталкивает его к мастеру.

========== Проблема ==========

Когда я пытаюсь переключиться между Hotdog и Master, Git думает, что произошли некоторые изменения. Случай с HamburgersRule выглядит иначе, чем у Git, но Windows считает, что это нормально. Каждый раз, когда я пытаюсь слить или оформить другую ветку, Git предупреждает меня, что я потеряю свои неподготовленные файлы.

Я могу подавить сообщение, установив для git config core.ignorecase значение true, но основная проблема все еще существует, и игнорирование различий в регистрах - вот что привело нас в этот беспорядок.

========== Решение ==========

1: сделать тройное переименование на мастере (чтобы убедиться, что новое имя файла правильное) HamburgersRule -> HamburgersRule_Rename -> HamburgersRule

2: объединить это изменение в ветку хот-дога. Чтобы слияние сработало, вам нужно удалить версию «Hamburgersrule» (используя вашу ОС, а не git)

3: Очистить оставшиеся файлы в Hotdog. Проверьте, работает ли слияние должным образом. Возможно, вам придется оформить заказ HamburgersRule из ветки Master:

git checkout master HamburgersRule

EDIT: Важная заметка. Если вы не хотите продолжать исправлять эту проблему снова и снова, убедитесь, что все ваши коллеги имеют значение ignorecase равным false

git config core.ignorecase false

Если кто-то игнорирует чувствительность к регистру, его клиент git игнорирует изменения и продолжает проверять плохое имя.

3 голосов
/ 27 июля 2014

Начиная с git 2.0.1 (25 июня 2014 г.), это слияние больше не будет неудачным.

См. commit ae352c7f37ef2098e03ee86bc7fd75b210b17683 от Дэвид Тернер (dturner-tw)

merge-recursive.c: исправлена ​​ошибка слияния с изменением регистра

В нечувствительной к регистру файловой системе при объединении файл будет ошибочно удален из рабочего дерева, если входящий коммит переименовал его, изменив только его регистр.
При объединении переименования файл со старым именем будет удален, но поскольку файловая система считает, что старое имя совпадает с новым именем, новый файл фактически будет удален.

Мы избегаем этого, не удаляя файлы, имеющие клон регистра в индексе на этапе 0.

2 голосов
/ 19 июля 2011

Может быть, этот ответ на другой вопрос будет полезен;Вы можете просто временно включить опцию…

git mv и изменить только регистр каталога

0 голосов
/ 19 июля 2011

Как насчет, если вы делаете git mv path/File.php path/file.php на B? Это должно позволить git знать, что это один и тот же файл с другим именем.

...