質問: 特定のブランチなど(tree-ish なオブジェクト)に存在する、特定のファイルの SHA-1 ハッシュを取得したいと考えています。 git の原理的に、checkout などによって index や worktree に対して変更を加えずとも、これを実現する方法はありそうだと考えているのですが、ご存知の方はいらっしゃいますでしょうか。 例えば: ``` git THECOMMAND HEAD:hoge-dir/fuga-file git THECOMMAND origin/develop:README ``` などで、該当するファイルの SHA-1 ハッシュを取得できたらよいと考えています。
回答: 確かに Git は SHA-1 ハッシュでオブジェクトを識別していますが、これはあくまでオブジェクトのハッシュであり、ファイルなどのデータ本体のハッシュではありません。 具体的には、データ本体の前にオブジェクトの種類や長さを付加したものが Git におけるオブジェクトであり、これをハッシュ関数にかけたものがオブジェクトIDになっています。 * Git の仕組み (1) - こせきの技術日記 * Git - Git Objects (もしくは日本語訳) ・・・とここまで書いて、「計算済みのハッシュ値を取り出したい」とは書かれていないことに気づきました。 ``` git show origin/develop:README ``` で当該オブジェクトの中身を表示できるので、これを sha1sum にでも流して ``` git show origin/develop:README | sha1sum ``` という感じでどうでしょうか。 ちなみにファイルパスを `./` から始めると、相対パスとして扱われるようです。