Git mv и только изменить регистр каталога
Пока я нашел аналогичный question, я не нашел ответа на свою проблему
Когда я пытаюсь переименовать каталог из FOO в foo через git mv FOO foo
, я получаю
fatal: renaming 'FOO' failed: Invalid argument
OK. Поэтому я пытаюсь git mv FOO foo2 && git mv foo2 foo
Но когда я пытаюсь выполнить через git commit .
, я получаю
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# foo
nothing added to commit but untracked files present (use "git add" to track)
Когда я добавляю каталог через git add foo
, ничего не меняется, а git commit .
снова дает мне такое же сообщение.
Что я делаю неправильно? Я думал, что использую чувствительную к регистру систему (OSX), почему я не могу просто переименовать каталог?
Ответы
Ответ 1
Вы находитесь в нечувствительной к делу среде. Кроме того, добавление без -A
не будет заботиться об удаленной стороне mv
, как это понимает Git. Внимание! Убедитесь, что во время этого не происходит никаких других изменений или невоспроизводимых файлов, или они будут зафиксированы как часть этого изменения! git stash -u
сначала, затем, а затем git stash pop
после. Продолжение: Чтобы обойти это, сделайте следующее:
mv foo foo2
git add -A
git commit -m "renaming"
mv foo2 FOO
git add -A
git commit --amend -m "renamed foo to FOO"
Это затянувшийся способ изменения рабочего каталога, совершения и последующего свертывания двух коммитов. Вы можете просто перенести файл в индекс, но кому-то, кто не знаком с git, он может быть недостаточно явным для того, что происходит. Более короткая версия
git mv foo foo2
git mv foo2 FOO
git commit -m "changed case of dir"
Как было предложено в одном из комментариев, вы также можете выполнить интерактивную переадресацию (git rebase -i HEAD~5
, если неверный случай был введен 5 коммитов назад), чтобы исправить этот случай и не иметь неправильного случая в любом месте в истории, Вы должны быть осторожны, если вы это сделаете, поскольку хеши-фиксаторы с этого момента будут разными, а другим придется переустанавливать или повторно объединять свою работу с недавним прошлым ветки.
Это связано с исправлением имени файла: Является ли Git нечувствительным к регистру?
Ответ 2
Вы хотите установить для параметра core.ignorecase
значение false, что сделает Git обращать внимание на случай в файловых системах, которые его не поддерживают. Чтобы включить в своем репо:
$ git config core.ignorecase false
Затем вы можете переименовать файл с помощью git mv
, и он будет работать как ожидалось.
Ответ 3
Мне удалось решить эту проблему, используя git 1.7.7, используя временное имя файла:
$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"
Ответ 4
(git mv
-вободный вариант.)
Я столкнулся с этой проблемой в Git в Mac OS X 10.9. Я решил это следующим образом:
git rm -r --cached /path/to/directory
Задает каталог для удаления в Git, но фактически не удаляет физические файлы (--cached
). Это также приводит к тому, что каталог, который теперь находится в соответствующем случае, отображается в незатрещенных файлах.
Итак, вы можете сделать это:
mv /path/to/directory /path/to/DIRECTORY
git add -A /path/to/DIRECTORY
Git затем распознает, что вы переименовали файлы, а когда вы делаете git status
, вы должны увидеть несколько строк renamed:
. Осмотрите их и убедитесь, что они выглядят корректно, и если это так, вы можете зафиксировать изменения в обычном режиме.
Ответ 5
Принудите его с опцией -f:
git mv -f FOO foo
Ответ 6
Это быстрое и надежное решение:
git mv -f path/to/foo/* path/to/FOO/
Внимание! Всегда переименовывайте все файлы в переименованной папке (используйте /*
).
Не переименовывать отдельные файлы. Это приводит к ошибке, описанной в этом .
Если вы сначала хотите увидеть результат, используйте -n
:
git mv -f -n path/to/foo/* path/to/FOO/
После создания mv
:
- Зафиксировать изменения
- Оформить заказ на любую другую версию
- Возврат заказа.
Теперь Git должен был переименовать папку BOTH во внутренние файлы и в файловую систему.
Ответ 7
Вы не используете файловую систему с учетом регистра в OS X, если вы явно не выбрали такой. HFS + может быть чувствительным к регистру, но по умолчанию регистр нечувствителен к регистру.
Ответ 8
У меня была одна связанная проблема.
Одна папка с именем "Pro" (созданная первой) и другая "pro" (созданная по ошибке). В Mac это одно и то же, но в зависимости от git.
$ git config core.ignorecase false
Конфигурация git переименовывает файлы в нужную папку (спасибо), а также создает файлы-призраки в 'pro' (Нет !!). Я не мог добавить изменения файла-призрака на дорожку, и я не мог извлекать другие ветки, если не носить эти файлы со мной, и я также не мог каким-то образом сбросить их.
Вместо этого я сделал
$ git rm -r --cached pro
$ git status // => pro files removed, new Pro files untracked
$ git add Pro
Чтобы сделать его более безопасным, я сделал это в отдельной ветке исправлений, а затем слился с основной веткой
Может ли любой гуру объяснить, как и почему? Заранее спасибо.
Ответ 9
Здесь очень простое решение для всех gitfoo на этой странице.
- Скопируйте файлы из своего проекта вручную.
- git rm все файлы.
- git совершить как обычно.
- добавить файлы обратно вручную.
- git добавить все файлы.
- git совершить как обычно.
- прибыль.
Ответ 10
Улучшение ответа Адама Димитрука (глупо, что SO не позволяет мне прокомментировать его ответ), используя "git mv" будет автоматически перестраивать точно перемещенные файлы. Нет необходимости блокировать и опасного "git add -A" можно избежать:
old="abc"; new="ABC";
tmp="$old-renamed";
git mv "$old" "$tmp";
git commit -m "Renamed '$old' to '$tmp'.";
git mv "$tmp" "$new";
git commit --amend -m "Renamed '$old' to '$new'.";
Ответ 11
Если вы выполните git mv AAA aaa
или git mv -f AAA aaa
, это не сработает, и у вас будет тот же fatal: renaming 'AAA' failed: Invalid argument
.
Поскольку AAA
и aaa
являются ОДНОЙ ЖЕ папкой/файлом в файловых системах без учета регистра, перемещение AAA
в aaa
означает перемещение AAA
как aaa/AAA
.
Так что вы должны сделать
git mv AAA aaa.1
git mv aaa.1 aaa
Я надеюсь, что это будет полезно для вас.