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

Я надеюсь, что это будет полезно для вас.