2009-06-02 13 views
16

git(git mvを使用)でファイルを移動した後、そのファイルのログを見ると、移動を含めたコミットだけが表示されます。gitでは、ファイルを移動した後に適用された古いコミットを表示できますか?

ファイルに適用されたコミットを古い名前で表示する方法はありますか?この例では、私は移動を行った後にgit logにコミットb04033bdc44f1と8ca40d563ce5dを見たいと思います。

$ 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]r.net> 
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が間違ったコマンドですか?

答えて

16

git-log -Mは」in GitFaq "Why does git not "track" renames ?"

述べたGitリポジトリ内diff機械が自動的にリネームを検出するためのサポートを持っているとして、これはのgit-diff-*家族に「-M」スイッチでオンになって、名前の変更情報をコミットの歴史を与えますコマンド。
名前変更の検出機構はgit-loggit-whatchangedで使用されています。
Gitは、名前の変更をまたいだマージの制限された形式をサポートしています。責任を割り当てるための2つのツール、git-blamegit-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の内容を変更していなかったので、このすべてが可能です。コンテンツが完全に異なる場合、--followオプションはすべての履歴を取得できませんでした。

+0

偉大な答えに感謝します! –

5

短い答え:新旧両方の名前を指定する

$ git log -M --follow bar 

または

$ git log -M -- foo bar 

を使用しています。

ところで、gitはヒューリスティックな類似性に基づくリネーム検出機能を使用しているため、おもちゃの例はあなたの望むように機能しないかもしれませんが、実生活の例(または変更のない内容の例)は期待通りに機能します。

git-pathの引数としてgit-logはパスフィルタではなく、パスリミッタ(およびディレクトリなど)であることに注意してください。

+0

良い点。 +1。実生活の例ではなく、「おもちゃ」の例に関連する「ヒューリスティックな類似性に基づく名前変更の検出」の部分を詳しく説明できますか? – VonC

+0

gitテストスイートで名前の変更が検出されたことをテストするための出力例を見てください。 http://repo.or.cz/w/git.git?a=blob;f=t/t4001-diff-rename.sh –

関連する問題