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), почему я не могу просто переименовать каталог?

211
10 июня '10 в 7:26
источник поделиться
10 ответов

Вы находитесь в нечувствительной к делу среде. Кроме того, добавление без -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 нечувствительным к регистру?

323
10 июня '10 в 7:52
источник

Связанные вопросы


Похожие вопросы

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

$ git config core.ignorecase false

Затем вы можете переименовать файл с помощью git mv, и он будет работать как ожидалось.

119
10 июня '10 в 7:51
источник

Мне удалось решить эту проблему, используя git 1.7.7, используя временное имя файла:

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"
52
13 янв. '12 в 1:32
источник

Принудите его с опцией -f:

git mv -f FOO foo
9
15 авг. '14 в 20:29
источник

(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:. Осмотрите их и убедитесь, что они выглядят корректно, и если это так, вы можете зафиксировать изменения в обычном режиме.

8
15 янв. '14 в 18:55
источник

Это быстрое и надежное решение:

git mv -f path/to/foo/* path/to/FOO/

Внимание! Всегда переименовывайте все файлы в переименованной папке (используйте /*).

Не переименовывать отдельные файлы. Это приводит к ошибке, описанной в этом .

Если вы сначала хотите увидеть результат, используйте -n:

git mv -f -n path/to/foo/* path/to/FOO/

После создания mv:

  • Зафиксировать изменения
  • Оформить заказ на любую другую версию
  • Возврат заказа.

Теперь Git должен был переименовать папку BOTH во внутренние файлы и в файловую систему.

7
11 июня '15 в 20:12
источник

Вы не используете файловую систему с учетом регистра в OS X, если вы явно не выбрали такой. HFS + может быть чувствительным к регистру, но по умолчанию регистр нечувствителен к регистру.

2
10 июня '10 в 7:47
источник

Здесь очень простое решение для всех gitfoo на этой странице.

  • Скопируйте файлы из своего проекта вручную.
  • git rm все файлы.
  • git совершить как обычно.
  • добавить файлы обратно вручную.
  • git добавить все файлы.
  • git совершить как обычно.
  • прибыль.
1
21 авг. '14 в 23:40
источник

У меня была одна проблема.

Одна папка с именем "Pro" (созданная первой) и "пыль" pro (созданная по ошибке). В Mac это одно и то же, но отличается от git.

$ git config core.ignorecase false

git config переименуйте файлы в нужную папку (спасибо), а также создайте файлы-призраки в 'pro' (No!!). Я не смог добавить изменения в файл призрака на трек, и я не мог проверить другие ветки, если не переносить эти файлы со мной, и я также не мог reset его каким-то образом.

Вместо этого я сделал

$ git rm -r --cached pro
$ git status // => pro files removed, new Pro files untracked
$ git add Pro

Чтобы сделать его более безопасным, я сделал это в ветки функции, а затем я слился обратно в главную ветку

В случае возникновения проблемы с призрачным файлом, может ли любой гуру объяснить, как и почему? Заранее спасибо.

0
24 янв. '17 в 5:31
источник

Улучшение ответа Адама Димитрука (глупо, что 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'.";
0
24 мая '13 в 13:42
источник

Посмотрите другие вопросы по меткам или Задайте вопрос