• ベストアンサー

git リポジトリ内のファイルの特定方法

git リポジトリから特定バージョンのファイルを取り出すのは簡単にできますが、その逆に取り出されたファイルが、リポジトリのどのバージョンで初めて現れたものかを、簡単に特定する方法はないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

自分がよく使う手はgit log -pで出たものを検索することですね。 gitでファイルを追加するcommitをすると、その内容を表すファイル (blob) がgitのリポジトリに作られ、それが入ったディレクトリ構造を示すファイル (tree) がgitリポジトリに作られ、そのtreeと以前のcommitを示すファイル (commit) がgitリポジトリに作られます。そして、そのcommitのファイル名がmasterというファイルに書かれます。なお、各ファイルのファイル名は内容のSHA1ハッシュ値です。 詳しくはこちらをご覧ください。 http://git-scm.com/book/en/Git-Internals-Git-Objects 構造上、特定のファイルが追加されたcommitを探すには、最新のcommitから逆順に追加されたファイルを探す以外にありません。しかしながら、もう少し効率良く探すなら、git log -pで全部表示させるより、treeファイルの差分だけ見たほうが良いかもしれません。

t-okura
質問者

お礼

簡単に調べる方法はなさそうなので、上記手順を行うスクリプトを作りました。 git log では --all をつけてすべてのブランチを対象にしました。 とりあえずこれで調べることができますが、commit が大量にある場合は時間がかかりそうです。 URL は、とても参考になりました。 ありがとうございます。

t-okura
質問者

補足

回答ありがとうございます。 URL も役立ちました。 とりあえずこんな方法で出来ることがわかりました。 例えばどのコミットのものかわからない README ファイルがあるとします。 README のハッシュ値を求めます。 >git hash-object README dff275a81ea9e79776fe7e3bec7804fc748eab83 README の変更履歴を求めます。 >git log --oneline -- README b2cb724 Update list of missing keywords in README. 2857c89 update stats 71c4452 add a link to the blog entry in README 35db1ad README update 8e10b3f fix typo 6a9f2b2 fix README info 各コミットの README のハッシュ値を調べます。 >git ls-tree b2cb724 README 100644 blob a00336c68d4ea68cefba917502c08ae794d33583 README 繰り返して ... >git ls-tree 71c4452 README 100644 blob dff275a81ea9e79776fe7e3bec7804fc748eab83 README 同じハッシュ値を持つREADMEが見つかったので、求めるのはコミット 71c4452 であることがわかりました。 この手順で、最初のREADMEがどのコミットのものか見つけることはできるのですが、かなり面倒です。 もっと簡単に調べる方法はないでしょうか。

関連するQ&A