Git Mv и только изменить регистр каталога

Пока я нашел похожий вопрос, я не нашел ответа на свою проблему

Когда я пытаюсь переименовать каталог из FOO в Foo через git mv FOO foo я получил

fatal: renaming 'FOO' failed: Invalid argument

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

12 ответов

Решение

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

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

$ git config core.ignorecase false

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

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

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"

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

Это быстрое и безопасное решение:

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

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

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

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

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

После того, как вы сделали mv:

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

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

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

git mv -f FOO foo

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

Одна папка с именем "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

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

Может ли какой-нибудь гуру объяснить, как и почему? Заранее спасибо.

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

У меня это отлично сработало в Windows. Использовал powershell со следующим:

  1. mv .\Folder-With-Wrong-Casing .\temp
  2. git add -A
  3. git commit -m "renamed folder with wrong casing to temp"
  4. mv .\temp .\Folder-with-Correct-Casing
  5. git add -A
  6. git commit --amend -m "Renamed to proper casing"
  7. (необязательный) git push

Благодаря ответу Адама выше.

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

  1. Скопируйте файлы из вашего проекта вручную.
  2. git rm все файлы.
  3. мерзавец, как обычно.
  4. добавьте файлы обратно вручную.
  5. Git добавить все файлы.
  6. мерзавец, как обычно.
  7. прибыль.

Улучшение ответа Адама Димитрука (глупо, что ТАК не позволяет мне комментировать его ответ), использование "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'.";

Вот простой способ сделать это.

  1. Убедитесь, что ваш рабочий каталог пуст.

  2. Временно отключить git ignore case

      git config core.ignorecase false
  1. Переименуйте любые каталоги (например, Папка => папка)
  2. Добавить изменения в рабочий каталог
      git add --all
  1. Сохраните свои изменения.
      git stash
  1. Исходные каталоги теперь должны быть удалены. Сделайте локальную фиксацию.
      git add --all
git commit -m "Rename directories"
  1. Поп-изменения
      git stash pop
  1. Измените это на свою предыдущую фиксацию.
      git add --all
git commit --amend
  1. Теперь у вас должен быть коммит с переименованными каталогами. Теперь вы можете восстановить исходную конфигурацию ignorecase:
      git config core.ignorecase true
Другие вопросы по тегам