スカッシュオプションなしでgitsubtreeaddを使用して、ツリーをリポジトリにマージしました。gitログは、コミットがリポジトリに正常に追加されたことを示しています。ただし、を実行するgit log --follow filename
と、履歴はマージで停止し、以前のコミットは表示されません。-M
代わりに使用してみましたが--follow
、それも機能しません。マージ前の特定のファイルのコミットのログを取得するにはどうすればよいですか?
2 に答える
「移動」ではなく、サブツリーからのファイルに対して作成された、git subtree merge
または「追加」を実行するコミット。git subtree add
これは、他のマージや移動のように、それらの履歴を追跡できないことを意味します。
必要なファイルの履歴は、マージ前にサブツリーを直接調べることで引き続き表示できます。ワークスペースが作成されたマージコミットである場合git subtree
、その2番目の親(HEAD^2
)は元のサブツリーの最後のコミットになります。ここから、元のサブツリーの内容を確認できます。
# Display the contents of the original subtree
git ls-tree HEAD^2
このコミットから、関心のあるファイルの変更を追跡できます。ファイルのパスは、ワークスペース内のサブツリー内で異なることに注意してください。ファイルの正しいパスを取得するには、--prefix
指定されたを削除する必要があります。git subtree
git log HEAD^2 --follow -- path-in-subtree/file
実際には、サブツリーマージで機能するはずですが、長い間ハック的であることが知られています[1-3] git log --follow
。
サブツリーのマージに固執し、戦略が複数の履歴を追跡するために有効であることに安心し、git log --follow
改善される避けられないイベントを辛抱強く待つことができます。git log --follow
現在、非常に有用なケースでいくつかの履歴を見ることができるため、これは実際には実行可能な決定である可能性があります。ファイルをトップレベルのリポジトリからサブリポジトリに移動したとすると、完全な移動を追跡できます。サブリポジトリに固有の履歴を追跡する場合は、実際には別のコピーを用意するか、サブリポジトリブランチをチェックアウトする必要があります。
代替案と回避策
次のようなファイルのログを取得できます[1]:
git log -- '*filename' # from the toplevel
これは、名前が。で終わるファイルに触れた各コミットを表示しますfilename
。実際の名前変更には従わず、同じベース名を持つ複数のファイルがある場合は誤検知が表示される可能性があります[1]。
さまざまな戦略を使用してリポジトリをマージすることもできます。参考文献[4]は、これを行う方法を示しています。これは、通常のサブツリーのマージでの方法に非常に近いものですが、追跡可能な履歴があります。基本的に、あなたは:
- 各サブリポジトリを、gitサブツリーや読み取りツリーではなく、通常のリモートとしてトップレベルリポジトリに追加、フェッチ、マージします。最初は、これはルートディレクトリを彼らのものであるかのように汚染するので、これはプロジェクトの最初の段階で行われます。
git mv
個別のフォルダへのサブリポジトリファイル
それで:
- アップストリームの変更は通常どおりフェッチしてマージできますが、
-Xsubtree
gitmergeのフラグが付いています。 - 他の場合も同様です。アップストリームのプッシュをテストしましたが、機能します。[4]のコメントを参照してください。
参考文献
[1]gitメーリングリストから http://git.661346.n2.nabble.com/Bug-Files-are-losing-history-after-subtree-merge-td7597197.html
[2]gitメーリングリストから http://git.661346.n2.nabble.com/gsoc-Better-git-log-follow-support-td6188083.html#a6188352
[3]git log --follow
はGoogleSummerofCodeに参加してい
ますhttps://git.wiki.kernel.org/index.php/SoC2011Ideas#Better_git_log_--follow_support