移動したファイルの履歴がgit logに表示されないのはなぜですか?それに対して何ができますか?


90

私はを使用していくつかのファイルの名前を変更しましたgit mv、使用されgit stash、HEADを(それを変更せずに)すばやく確認してgit stash popから、全体を再び取得しました。私の動きはコミットリストから消えていたので、私はそれらをやり直しました、git rmそしてコミットメッセージはgitが名前の変更が名前の変更であることを発見したと主張しました。だから私はそれ以上は考えませんでした。

しかし、今、コミット後、移動したファイルの履歴を取得できません!問題のコミットについてgitが言っていることは次のとおりです:

~/projects% git log --summary
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.h
 delete mode 100644 test/R_DebugUI_iOS.m
 create mode 100644 system/runtime/src/R_DebugUI_iOS.h
 create mode 100644 system/runtime/src/R_DebugUI_iOS.m

 <<snip older commits>>
 ~/projects%

現在、これらの移動されたファイルの1つの履歴を取得しようとしているため、古いバージョンを表示できますが、あまり有用なものはありません。

~/projects/system/runtime/src% git log --follow --find-copies-harder -M -C R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime
~/projects/system/runtime/src% 

(私もせずに、それを試してみた-M-C--find-copies-harder、しかし無駄に。)

古い名前で履歴を取得できます。古い場所から削除された時点で停止します。

~/projects% git log --summary --follow --find-copies-harder -M -C -- test/R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.m

commit 32a22d53c27e260714f759ecb3d3864e38b2e87f
Author: brone
Date:   Tue Dec 7 23:52:51 2010 +0000

    Can set debug UI's alpha.

<<snip older commits>>
~/projects%

だから、今回は完全に行き詰まっているわけではありませんが、この種のことをいつもしなければならないというのはおもしろくないでしょう。(私は、人生で少なくとも1回は移動するかなりの数のファイルがあると予想しています。)

私は何か間違ったことをしていますか?ファイルの古いコピーと新しいコピーは98.8%同一です(166のうち2行が変更されています)。私の理解では、gitは名前を変更する操作を明示的に保存するのではなく推論し、ファイルは十分に類似しているため、同じと見なす必要があると信じているため、この場合のファイルを追跡できるはずです。

これを修正するために私ができることはありますか?


推測:〜/ projects / system / runtime / srcの代わりに〜/ projects /内でコマンドを実行すると機能しますか?
ダグラス

いいえ、同じ結果になります。(一般的にgitはとにかく任意のフォルダに移動できるようになっています...)

でもそれでアイデアが浮かんだので、質問を更新して結果を見つけました。コメントをありがとう!

mswindowsで「tortoiseGit 1.5.8.0」と「1.7.3.1.msysgit.0」を併用しています。エクスプローラでファイルの名前を変更してコミットすると、GUIに「status = Rename」と表示されます。私はgitについてコマンドラインでこれを実行する方法を十分に理解していません。
k3b 2010

3
これはだましですか?stackoverflow.com/questions/2314652/…–
cregox

回答:



28

ええと、私はgit log -M --summary..


git log -M --summary特定のファイルの履歴を見ているだけの場合、つまりファイル引数を使用している場合は、名前変更情報は表示されません。
vinc17

17

問題を正確に解決していなくても、自分の懸念を和らげることができたので、自分の質問に答えます。(git log --followただし、私にはまだ機能しません。)

まず、--summary名前の変更コミットのログにはdelete、ファイルの古い名前の行が含まれます。そのため、見つけやすい場合は、その古い名前とgit logそこから見つけることができます。

それが大きなコミットの一部であり、そのために見つけるのが少し難しい場合-そして、この状況が私の心配の1つだった- git blame -C最初の名前変更後のリビジョンでのファイルの新しい名前で使用できます。おそらく元のファイルの行が残っています!-ですので、gitはソースを見つけて、古いファイル名(および適切な方法でコミットハッシュ)を表示する必要があります。その後、でトレイルをピックアップできgit logます。

したがって、(何らかの理由で)1つの単位としてのファイルの履歴に何らかの関心がある場合は、比較的簡単に行うことができるようです。私はgitがあなたがそれを適切に使用することを好むだろうという印象を得ます


6
削除/追加ではなく実際に名前変更を表示するには、-Mオプションが必要だと思います
Adrian Cornish

1
同じ問題を抱えていてgit log --follow .、作業ディレクトリが新しい場所である場合に作業ディレクトリが異なることにgit log --follow path/to/new/dir
注意してください。

1
--followパラメータは、作業を行いますが、あなたは何をする必要があります:git log --follow -- ./path/to/file
DrumM

git -log filename.csファイル移動のコミットで停止する問題が発生しました(現在のディレクトリがファイルのフォルダーに設定されています)。ただし、VS履歴ウィンドウには、ファイル全体の変更ログが表示されます。また、Githubデスクトップでファイルが移動されたことがわかります。ただしgit log -10 --follow filename.cs、移動コミット前のログも表示されます。
oleksa

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.