4

ファイルのリストと、それぞれの古いブロブと新しいブロブを単一のコミットで取得する方法を見つけようとしています。

3 つのファイルを変更した commit 1 があるとします。上記の関数を実行し、古い BLOB と新しい BLOB と共に 3 つのファイルを返します (バイナリではない場合)。

これを行う唯一の方法は、コミットと以前のコミットを取得し、それらのツリーを解決してから、ツリーで差分を作成して何が違うのかを調べ、異なるファイルごとに blob を取得することでしょうか?

4

3 に答える 3

3

これを行う唯一の方法は、コミットと以前のコミットを取得し、それらのツリーを解決してから、ツリーで差分を作成して何が違うのかを調べ、異なるファイルごとに blob を取得することでしょうか?

はい、これが推奨される方法です。「古い」エントリと「新しい」エントリは、2 つの を比較するときに意味のある概念にすぎませんTree

「古い」「新しい」は表現力豊かな修飾子ではないことに注意してください。差分ヘッダーをのぞくことができるので、エントリの結果の差分ステータスは次のようになります。

  • GIT_DELTA_UNMODIFIED = 0, /** 変更なし */
  • GIT_DELTA_ADDED = 1, /** 古いバージョンではエントリが存在しません */
  • GIT_DELTA_DELETED = 2, /** エントリは新しいバージョンに存在しません */
  • GIT_DELTA_MODIFIED = 3, /** エントリの内容が新旧の間で変更されました */
  • GIT_DELTA_RENAMED = 4, /** エントリは古いものと新しいものの間で名前が変更されました */
  • GIT_DELTA_COPIED = 5, /** エントリは別の古いエントリからコピーされました */
  • GIT_DELTA_IGNORED = 6, /** エントリは workdir 内の項目を無視します */
  • GIT_DELTA_UNTRACKED = 7, /** エントリは作業ディレクトリ内の追跡されていないアイテムです */
  • GIT_DELTA_TYPECHANGE = 8, /** 古いものと新しいものの間でエントリのタイプが変更されました */

libgit2 tests-clar/diff/treeテスト ファイルは、この機能の使用例を提供するはずです。

アップデート:

同様の質問(あなたから? ;-) ) が libgit2 issue tracker で提起されました。@arrbee からの回答も、git_diff_tree_to_tree() API.

于 2013-01-13T21:43:40.797 に答える
0

以前のリビジョンと現在のリビジョンの SHA1 を抽出する

git show --raw v1.8.1^0git 自身のリポジトリでの出力を検討してください。

コミット 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 の SHA1 をフェッチする

特定のコミットに関連付けられているすべての 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
...
于 2013-01-14T02:42:07.270 に答える
-1

Git コマンドのみを使用すると、この情報にアクセスするための特定の libgit2 関数についてはわかりませんが、おそらくそれを理解することができます。

を使用して、特定のコミットで変更されたファイルのファイル リストを取得できますgit show --stat COMMIT。下部には、変更されたファイル パスのリストが表示されます (さらに、変更された行数の詳細も表示されます)。おそらくそこからものを除外できます。さらに整形式を使用して、出力からさらに多くのコンテンツを削除できます。

ファイル パスを取得したら、 を使用してファイル blob を取得できますgit show COMMIT:PATH。を使用して、以前のバージョンのファイルを取得しますgit show COMMIT^:PATH

于 2013-01-13T21:54:00.920 に答える