Почему «git log -‌- foo» не работает для удаленного файла foo?

89

Мой репозиторий претерпел такие изменения, как:

  1. ... некоторые несвязанные коммиты ...
  2. Зафиксировать новый файл fooсо 100 строками содержимого
  3. ... промежуточные коммиты, некоторые из которых касаются foo...
  4. Вставьте содержимое fooв начало существующего файла barи git rm fooв тот же коммит
  5. ... больше несвязанных коммитов ...

Теперь я хочу увидеть журнал удаленного файла foo. Все, что я читал, включая SO, говорит, что я должен уметь git log -- foo, но эта команда не выводит.

Если я найду фиксацию, включающую удаление, fooя могу git log 1234abcd -- fooувидеть ее журнал, так что я думаю, что мой путь fooне является проблемой. Также обратите внимание, что git merge-base HEAD 1234abcdвыходные данные 1234abcd[...], поэтому я думаю, что это должно доказать, что фиксация доступна из HEAD. Обратите внимание, что fooв моем рабочем дереве нет файла (очевидно, поскольку он был удален). Использование Git 1.7.1.1 в OS X.

Почему git log -- fooу меня не работает и как это исправить? Благодарность!

user385804
источник
5
Вы пробовали git log --follow -- fooили git log --follow -M -- foo? (для принудительного обнаружения переименования)
VonC
1
Дерьмо, я действительно пробовал - --followно, читая, historyя вижу, что с тех пор, когда я попробовал, я записал компакт-диск в другом месте, что сделало путь недействительным. git log --follow -- fooработал, когда я пытался с правильной отправной точки. Я предполагаю , что Git считается качению fooв barкачестве своего рода переименования? В любом случае спасибо! Я буду счастлив поверить в это, если вы перепубликуете его в качестве ответа.
user385804 07
1
Раздражает, что в заголовке вопроса --меняют на ...
Cascabel

Ответы:

118

Вы хотите использовать --followопцию on git log, которая описана на странице руководства как:

Continue listing the history of a file beyond renames.

По сути, это не только позволяет вам видеть историю переименованного файла, но также позволяет вам просматривать историю файла, которого больше нет в рабочем дереве. Таким образом, команда, которую вы должны использовать, должна выглядеть примерно так:

git log --follow -- foo

Обновить:

Git 2.9+ теперь включено это по умолчанию для всех git diffи git logкоманд:

Команды уровня Porcelain для конечных пользователей из семейств «git diff» и «git log» по умолчанию включают обнаружение переименования; вы все еще можете использовать переменную конфигурации "diff.renames", чтобы отключить это.

Спасибо x-yuri за хедз-ап!

Натан Клейн
источник
1
У меня работало без --followдетали. Мне просто нужно было добавить --. Я бегу git-2.9.0.
x-yuri