Git Mv и только изменить регистр каталога - PullRequest
246 голосов
/ 10 июня 2010

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

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

Ответы [ 10 ]

381 голосов
/ 10 июня 2010

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

139 голосов
/ 10 июня 2010

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

$ git config core.ignorecase false

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

57 голосов
/ 13 января 2012

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

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"
13 голосов
/ 15 января 2014

(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 голосов
/ 11 июня 2015

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

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 должен был переименовать папку ОБА во внутренних файлах и в файловой системе.

8 голосов
/ 15 августа 2014

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

git mv -f FOO foo
2 голосов
/ 24 января 2017

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

Одна папка с именем «Pro» (созданная первой) и другая «pro» (созданная по ошибке). В Mac это одно и то же, но в зависимости от git.

$ git config core.ignorecase false

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

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

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

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

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

2 голосов
/ 10 июня 2010

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

1 голос
/ 22 августа 2014

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

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

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