ファイルのリストと、それぞれの古いブロブと新しいブロブを単一のコミットで取得する方法を見つけようとしています。
3 つのファイルを変更した commit 1 があるとします。上記の関数を実行し、古い BLOB と新しい BLOB と共に 3 つのファイルを返します (バイナリではない場合)。
これを行う唯一の方法は、コミットと以前のコミットを取得し、それらのツリーを解決してから、ツリーで差分を作成して何が違うのかを調べ、異なるファイルごとに blob を取得することでしょうか?
これを行う唯一の方法は、コミットと以前のコミットを取得し、それらのツリーを解決してから、ツリーで差分を作成して何が違うのかを調べ、異なるファイルごとに blob を取得することでしょうか?
はい、これが推奨される方法です。「古い」エントリと「新しい」エントリは、2 つの を比較するときに意味のある概念にすぎませんTree
。
「古い」と「新しい」は表現力豊かな修飾子ではないことに注意してください。差分ヘッダーをのぞくことができるので、エントリの結果の差分ステータスは次のようになります。
libgit2 tests-clar/diff/treeテスト ファイルは、この機能の使用例を提供するはずです。
同様の質問(あなたから? ;-) ) が libgit2 issue tracker で提起されました。@arrbee からの回答も、git_diff_tree_to_tree() API
.
git show --raw v1.8.1^0
git 自身のリポジトリでの出力を検討してください。
コミット 5d417842efeafb6e109db7574196901c4e95d273 作者:浜野ジュニオC 日付: 月 12 月 31 日 14:24:22 2012 -0800 ギット 1.8.1 署名者: Junio C Hamano <gitster@pobox.com> :100644 100644 fec1a06... d6f9555... M Documentation/RelNotes/1.8.1.txt :100644 100644 b0e8f02... 7a3f03b... M Documentation/git.txt :100755 100755 b2dffc8... 72e37c9... M GIT-VERSION-GEN
最後の 3 行は、そのコミットで変更されたファイルを示します。変更行の最初の SHA1 は、特定のファイルの以前のリビジョンのオブジェクト名であり、2 番目は、名前付きコミットの blob です。たとえば、GIT-VERSION-GEN
ハッシュv1.8.1
で
$ git show v1.8.1^0:GIT-VERSION-GEN | git ハッシュ オブジェクト --stdin 72e37c9bfe3e897635f8c211569d9e6f5658a980
その親コミットに関連付けられているブロブは
$ git show v1.8.1^0~:GIT-VERSION-GEN | git ハッシュ オブジェクト --stdin b2dffc839f306123d544e8f536ee31a7574f1139
注:git rev-parse
説明のドキュメント
特別な規則として、
<rev>^0
コミット自体を意味<rev>
し、コミット オブジェクトを参照するタグ オブジェクトのオブジェクト名である場合に使用されます。
この場合、v1.8.1^0
タグが参照するコミットを意味しv1.8.1
ます。
特定のコミットに関連付けられているすべての BLOB のオブジェクト名を取得するには、次のような の出力を参照git ls-tree
してください。
$ git ls-tree -r v1.8.1^0 100644 ブロブ 5e98806c6cc246acef5f539ae191710a0c06ad3f .gitattributes 100644 ブロブ f702415c12c5a4a66180f7ffd697347e5343ac4a .gitignore 100644 ブロブ c7e86183001a00ad2105765708b5b59852ef6640 .mailmap 100644 ブロブ 536e55524db72bd2acf175208aef4f3dfc148d42 コピー中 100644 ブロブ ddb030137d54ef3fb0ee01d973ec5cee4bb2b2b3 Documentation/.gitattributes 100644 ブロブ d62aebd848b2a44f977ad4d7c4b75b6ff72b2163 ドキュメンテーション/.gitignore 100644 blob 69f7e9b76c3f9b87b7951fb0df6a9720edadeb3e ドキュメンテーション/コーディングガイドライン 100644 ブロブ e53d333e5c08515af1e21d81c7daa365b12609a1 ドキュメント/メイクファイル 100644 ブロブ fea3f9935b7794ce86f04d22c9d68fb9d537167d Documentation/RelNotes/1.5.0.1.txt 100644 ブロブ b061e50ff05b5e13211bb315e240974e898de32c Documentation/RelNotes/1.5.0.2.txt ...
Git コマンドのみを使用すると、この情報にアクセスするための特定の libgit2 関数についてはわかりませんが、おそらくそれを理解することができます。
を使用して、特定のコミットで変更されたファイルのファイル リストを取得できますgit show --stat COMMIT
。下部には、変更されたファイル パスのリストが表示されます (さらに、変更された行数の詳細も表示されます)。おそらくそこからものを除外できます。さらに整形式を使用して、出力からさらに多くのコンテンツを削除できます。
ファイル パスを取得したら、 を使用してファイル blob を取得できますgit show COMMIT:PATH
。を使用して、以前のバージョンのファイルを取得しますgit show COMMIT^:PATH
。