В git вы можете просмотреть старые коммиты, применяемые к файлу после его перемещения?

После того, как я переместил файл в git (используя git mv), просмотр журнала для этого файла показывает только коммиты, включая и после перемещения.

Есть ли способ просмотреть коммиты, применяемые к файлу под его старым именем? В приведенном ниже примере я хотел бы видеть коммиты b04033bdc44f1 и 8ca40d563ce5d в git log после того, как я сделал ход.

 $ git init
Initialized empty Git repository in /Users/ben/code/git_mv_example/.git/
 $ touch foo
 $ git add foo
 $ git commit -m "Initial commit"
Created initial commit 8ca40d5: Initial commit
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 foo
 [master*]$ echo "abcdefg" > foo
 [master*]$ git commit -a -m "edited foo"
Created commit b04033b: edited foo
 1 files changed, 1 insertions(+), 0 deletions(-)
 $ git log foo
commit b04033bdc44f1eb3477270b4b7ca727377d8c03a
Author: Ben Brinckerhoff <[email protected]>
Date:   Tue Jun 2 13:26:53 2009 -0600

    edited foo

commit 8ca40d563ce5d07d965bfb75a01b9c23378fd321
Author: Ben Brinckerhoff <[email protected]>
Date:   Tue Jun 2 13:26:15 2009 -0600

    Initial commit
 $ git mv foo bar
 [master+]$ git commit -a -m "renamed foo to bar"
Created commit 2bccdf6: renamed foo to bar
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename foo => bar (100%)
 $ git log bar
commit 2bccdf6fc65b9da5b279d9f1117e436549dd3a7b
Author: Ben Brinckerhoff <[email protected]>
Date:   Tue Jun 2 13:27:14 2009 -0600

    renamed foo to bar
 $ git log foo
fatal: ambiguous argument 'foo': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

Разве это невозможно? Или может быть git log неправильная команда для этого?

Ответы

Ответ 1

'git-log -M' предоставит историю фиксации с информацией переименования, как упоминалось в GitFaq "Почему git not" track "переименовывает?"

Механизм diff в git поддерживает автоматическое обнаружение переименований, он включается переключателем '-M в семейство команд git-diff-*.
Механизм обнаружения переименования используется git-log и git-whatchanged.
Git также поддерживает ограниченную форму слияния переименований. Два инструмента для назначения вины, git-blame и git-annotate оба используют код автоматического переименования для отслеживания переименований.

В качестве особого случая 'git log' версия 1.5.3 и более поздняя имеет опцию '--follow' что позволяет вам переименовывать, когда задан единственный путь.


в вашем примере:

F:\prog\git\test\rename>git log --follow bar
commit 81f52b91eb2fc7ad18051c93f3e4d583f27c15ca
Author: VonC <>
Date:   Tue Jun 2 21:54:43 2009 +0200

    renamed foo to bar

commit 71aff26ace6ab249ab2042d1e5d20377486ce478
Author: VonC <>
Date:   Tue Jun 2 21:54:19 2009 +0200

    edited foo

commit c893199da767eddac6a547b940557435ade4d18c
Author: VonC <>
Date:   Tue Jun 2 21:53:51 2009 +0200

    initial commit

Примечание: все это возможно, потому что вы не изменили содержимое foo до переименования в bar. Если содержимое было совершенно иным, параметр --follow не смог бы получить всю историю.

Ответ 2

Короткий ответ: используйте

$ git log -M --follow bar

или

$ git log -M -- foo bar

с указанием как старого, так и нового имени.

Кстати, поскольку git использует определение переименования на основе эвристического сходства, примеры игрушек могут работать не так, как вам хочется, в то время как примеры реальной жизни (или примеры с более неизменным содержимым) будут работать, как ожидалось.

Обратите внимание, что в пути git в качестве аргумента для git -log нет фильтра путей, но ограничителя пути (и может быть, например, быть каталогом).