2016-04-26 17 views
2

指定したコミットでファイルのSHAハッシュを取得するにはどうすればよいですか?私はgit log fileを使ってファイルに触れたすべてのコミットを得ることができますが、特定のコミットごとにファイルのSHAハッシュを取得するにはどうすればよいですか?特定のコミットでファイルのSHAハッシュを取得する

は私がgit-hash-objectを使用するよりも、コミットやチェックアウトすることによってそれを行うことができると思いますが、もっと簡単な方法がなければなりません。

+0

のように見えるあなただけのファイルの内容の逐語SHA1が必要ですか、あなたはGitリポジトリの歴史の中で、ファイルを格納するために使用されるBLOBオブジェクトのSHA1をしたいですか? – knittl

+0

ブロブオブジェクトにファイルモードが含まれていることを正しく理解していますか?それが違いならば、 'sha1sum file'を実行するのと同じように、ファイルの内容だけが必要です。 – Paladin

+0

blobには追加の型と長さの情報とnullバイトが含まれています – knittl

答えて

3

git showgit logは近いいとこと株式オプションです。あなたの質問は、特定のコミットに関連するファイルのSHA-1オブジェクト名についても、その履歴に沿って各コミットについて同じ情報について尋ねました。

--rawオプションは、後にしている情報を提供します。以下の例では、git独自のリポジトリを使用します。

git showまたはgit log -1を使用して、特定のと変更されたファイルをコミットし表示します。後者は、タグオブジェクトの出力を生成せず、タグ付きコミットのみを生成します。

$ git log -1 --raw v2.8.1 
commit d95553a6b8c5153f541adcfc3346004e8249b0e6 
Author: Junio C Hamano <[email protected]> 
Date: Sun Apr 3 10:11:35 2016 -0700 

    Git 2.8.1 

    Signed-off-by: Junio C Hamano <[email protected]> 

:000000 100644 0000000... ef6d80b... A Documentation/RelNotes/2.8.1.txt 
:100644 100644 adc940b... 8afe349... M Documentation/git.txt 
:100755 100755 4e9450b... 46595da... M GIT-VERSION-GEN 
:120000 120000 7db3040... d40c3e1... M RelNotes

各変更ラインは、得られるまたは宛先モード(000000が削除またはマージされていない示す)開始またはソースモード(000000が作成またはマージされていない示す)

    • が含ま
    • ソースSHA-1(
    • デスティネーションSHA-1(削除用のすべてゼロ)
    • のステータスコードに加えて任意の数値スコア

    がいっぱい詳細“Raw output format” in git diff’s documentation参照

  • パス(A上記の添加とM変形例です)。

    v2.8.1タグに関連付けられたファイルRelNotesためのSHA-1オブジェクト名がある、我々は確認しRelNotesのためのハッシュを表示するには

    $ git rev-parse v2.8.1:RelNotes 
    d40c3e126c03b0e4bd9c6162f63a35a45f5e9020

    で、すべての40桁に拡張することができd40c3e1、ありますバージョン2.8.1の歴史の中で道に沿って、特定のバージョンに対応する下Documentation/RelNotesを指すシンボリックリンク:

    $ git log --raw v2.8.1 -- RelNotes 
    commit d95553a6b8c5153f541adcfc3346004e8249b0e6 
    Author: Junio C Hamano <[email protected]> 
    Date: Sun Apr 3 10:11:35 2016 -0700 
    
        Git 2.8.1 
    
        Signed-off-by: Junio C Hamano <[email protected]> 
    
    :120000 120000 7db3040... d40c3e1... M RelNotes 
    
    commit c9906e47c065940bfe1a9992da494a8f437a49ac 
    Author: Junio C Hamano <[email protected]> 
    Date: Tue Jan 12 15:20:51 2016 -0800 
    
        First batch for post 2.7 cycle 
    
        Signed-off-by: Junio C Hamano <[email protected]> 
    
    :120000 120000 3ba13ce... 7db3040... M RelNotes 
    
    commit 24a00ef646974be49ef7138239c3803805400797 
    Author: Junio C Hamano <[email protected]> 
    Date: Mon Oct 5 12:58:10 2015 -0700 
    
        Start cycle toward 2.7 
    
        Signed-off-by: Junio C Hamano <[email protected]> 
    
    :120000 120000 def6ebd... 3ba13ce... M RelNotes 
    [...]

    は、すべての40進数字を取得するために--abbrevオプションを使用しますハッシュ。ここで出力はgit showの出力がv2.8.1タグとコミットの両方をカバーしているので、出力は余計に表示されますv2.8.1が指しています。

    $ git show --raw --abbrev=40 v2.8.1 
    tag v2.8.1 
    Tagger: Junio C Hamano <[email protected]> 
    Date: Sun Apr 3 10:14:32 2016 -0700 
    
    Git 2.8.1 
    -----BEGIN PGP SIGNATURE----- 
    Version: GnuPG v1 
    
    iQIcBAABAgAGBQJXAU94AAoJELC16IaWr+bLopQQAONTo52BGPCr7exw757SKY90 
    gYsHDxTaNpPtGZS7ltdOiEESPG3Mx3w1OYk7CBPtxjBLM+JvEdcZsCKrs/RlTrKL 
    lTc53WHC1tUa8EYjEyHNq4z0E2y4tCTNsj5eD2n/lAdTn2SK59bL4DEouDP2mYJU 
    3pUkujD9tu/ATw1s77VNiHxcrg9V9TdltaP2+lkHPzXXx8fb8kkabFRkzqvQdgfe 
    Qe0mZEHKRZY4nEO16dKukalxyWW0iMfoSVeRTjJiQU4HEcMyEnG3lfKeI1ddKVTQ 
    +XfAM6QianXqdfHRt5ol9MwCm9HAcGWu82caIBOTsc3L7bDrbJTTkDOvwpmVUDJi 
    WcqgocDGr/x7RA0/E8bqoIv40UXx07DzBTv3mKBo2CMvkow6pgQjsKKfPrvoNKyC 
    qFqp07A3UXgLWeWLF2iaYJklkq2jEeLPKOCJ1lJcPUg+Kk20+FQEo1XPERnrosoz 
    xHDDMBy7Vnvd0ij8Ipaxj2XHfIVYHC/WcrfsjiRYa1sHMjdTw/6I0tdtdUkDiY2W 
    70AsYQUWPtU52tSuK7divMoym3g583bNtu5X+6STDtLZc5XbVAtMEg5PYadTuwci 
    tTmXTUrti2qLsDp2XZI7rKbKVo5JyW8BYC8BeLUwgVnkj9svG5+6rlTKtgXa+hCo 
    L9gDU1Iie03IlIHnL+/s 
    =NLvn 
    -----END PGP SIGNATURE----- 
    
    commit d95553a6b8c5153f541adcfc3346004e8249b0e6 
    Author: Junio C Hamano <[email protected]> 
    Date: Sun Apr 3 10:11:35 2016 -0700 
    
        Git 2.8.1 
    
        Signed-off-by: Junio C Hamano <[email protected]> 
    
    :000000 100644 0000000000000000000000000000000000000000 ef6d80b008a0a7970238404b034593be27e933c3 A  Documentation/RelNotes/2.8.1.txt 
    :100644 100644 adc940bf7591069c74c9b47aa5e5686e0438d606 8afe349781d57527083fdb75511959fd25a4239b M  Documentation/git.txt 
    :100755 100755 4e9450b3ae0c403820f0166435c52c4ea74e7451 46595dad2234f861198347ef8f4f60d167061709 M  GIT-VERSION-GEN 
    :120000 120000 7db30403c3471e15f4f15a5e68016d7926b3e3de d40c3e126c03b0e4bd9c6162f63a35a45f5e9020 M  RelNotes

    Gitが前面にメタデータを追加するため、BLOBのSHA-1オブジェクト名は、(Gitはファイルの内容を表す方法)ファイルにsha1sumを実行すると同一ではない:スペースに続くリテラル文字列blobを、その後に10進数の内容の長さが続き、NULバイトで終了します。我々は唯一のSHA-1が欲しいgitのを教えてくれ--pretty=%H-- RelNotes

    $ for commit in $(git log --pretty=%H v2.8.1 -- RelNotes | head -3) ; \ 
        do git show ${commit}:RelNotes | sha1sum ; \ 
        done 
    ce5501f9daadf110a20a4e4eccdfed63ef4b27e3 - 
    bd4d920214c4a48d8820292e24f020690595858d - 
    5d47b511d86abd490fa4f2c2a8d4ef3589e1aecf -

    の線に沿ってコマンドを使用して、時間に後方に行くファイルの連続したバージョンの内容のSHA-1ハッシュを計算するために、 RelNotesに接触するコミットのハッシュ(最新の3つに制限されているのはhead -3です)。これらのコミットのそれぞれについて、追跡されたコンテンツをsha1sumに送ります。あなたがxargsを希望する場合

    、それは

    $ git log --pretty=%H v2.8.1 -- RelNotes | head -3 | 
        xargs -I {} sh -c 'git show {}:RelNotes | sha1sum' 
    ce5501f9daadf110a20a4e4eccdfed63ef4b27e3 - 
    bd4d920214c4a48d8820292e24f020690595858d - 
    5d47b511d86abd490fa4f2c2a8d4ef3589e1aecf -
  • 1

    最低でも、あなたがコミットチェックアウトする必要はありません。 git showは、blobを含むオブジェクトを直接表示できます。それをチェックアウトすることなく、gitのhash-objectに送ることができます。

    git hash-object <(git show [commit]:[path]) 
    

    ので、例えば、

    $ git hash-object <(git show master:Makefile) 
    3fb4e1cbe0019c691a504e3419ece252db6f60ab 
    
    +0

    コミットのツリーにはすでにBLOBオブジェクト(ファイル)へのポインタがあります。 OPの要件に応じて、これで十分です。 – knittl

    +0

    これはすごく、ありがとう。それは、プロジェクトのより多くの変更されたファイルの全履歴について3秒未満で合理的に高速です。これはいくつかのスクリプトで私を助けてくれるでしょう:)ありがとうagain – Paladin

    +0

    @ zebediah49:1つの質問ですが、なぜそれは 'sha1sum file'とは異なる文字列を表示しますか?私の作業ツリーには変更がないので、最初のハッシュが 'sha1sum file'の出力と同じであることを期待しています。これを使用しています:' $でコミットする(git log --oneline path/to/file | cut -d \ -f1); git hash-object <(git show $ commit:path/to/file);を実行します。 done' – Paladin

    2

    がためのGitのハッシュを取得するための非常に簡単な方法があります

    は、私はより効率的な方法があるはずだと思いますが、あなたが行うことができますいくつかの内のファイルをコミット:

    git rev-parse <commit-ID>:/path/to/file 
    

    のGitのハッシュは、SHA-1のスペースに続く単語blobのあります、あなたは、実際のSHA-1の欲しいようですが、しかし、コメントから見え

    size=$(wc -c $file) 
    (printf "blob %d\0" $size; cat $file) | sha1sum - 
    

    :ファイルの内容に続いて、NULバイトに続くバイト単位のファイルのサイズを与えて、小数点ASCII文字列が続きますgitのハッシュ(他の誰かがファイルを抽出し、その上にsha1sumを実行することによって得られるような)、およびでないファイルの内容:

    git show <commit-ID>:path | sha1sum - 
    

    は一般(非bashの固有)法では、(bashのの<(ですファインも同様に、fdescファイルシステムがマウントされていることを確認してください)。

    関連する問題