2017-10-23 12 views
0

我々はIDトラッキングをサポートするVCSを使用する場合AImp.javaの完全な履歴をしたい(そしてそれは古いからマージするために、我々は、我々が与えられた実装Gitの名前を変更して、同じ古い名前の新しいファイルを作成する - git logの期待される動作?

Rename file A.java to AImp.java 
Create new file A.java 

からインターフェイスを抽出したいときに我々はそれを行う一般的なパターンを持っていたがA.java)はAImp.javaに

をマージされます今、私たちは、Gitのに移動し、そして私は、このパターンを繰り返したい:

echo "class A {}" > A.java 
git add . 
git commit -m "new class A" 
git mv A.java AImp.java 
git commit -m "rename A->Aimp" 
echo "interface A {}" > A.java 
git add . 
git commit -m "create new interface A" 

私は分離された二つの中で名前の変更と追加をやっているので、名前変更のコミット検出が機能する。

e7579fb (HEAD -> master) create new interface A 
610a9b3 rename A->Aimp 
b94e8bf new class A 

しかし、(私の意見表明のための)A.javaの歴史は間違っている:: 現在の歴史は、このようなものです

e7579fb (HEAD -> master) create new interface A 

git log --oneline --follow A.java 

e7579fb (HEAD -> master) create new interface A 
610a9b3 rename A->Aimp 
b94e8bf new class A 

私だけ見に期待しましたどう思いますか ?

(私は検出アルゴリズムの名前を変更するに起因する、私はAimp.javaに古いA.javaからマージ期待できないことを知っている)

おかげ

ボアズ

答えて

0

のGitのgit log --followが安っぽいハックです。

あなたがgit log -ingの(単一の)ファイルが名前変更されたことが検出された場合、コミットによってコミットすることをGitに伝えます。古い名前。

という名前の新しいファイルがあるので、Gitは新しい名前で新しいコミットを表示します。それで、という名前のファイルを持つコミットが見つかるので、コミットも表示されます... A.javaここではと異なるA.javaです。

ハックを向上させることができた:あなたは--followで実行していると、Gitはあなたがフォローしている名前に改名を検出した場合、Gitはだけではないことがコミットを示すと(の親をコミットすることを歩いていない、そこに停止する可能性の)。 (これは純粋に技術的な理由から難しく、単にハックを改善するのではなく、本当のフォロワーを書く方が良いでしょうが、それははるかに難しいです)

関連する問題