• ベストアンサー

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

  • Gitリポジトリの取得方法

    Gitと言う物を初めて使います。 やりたいことは、SourceForgeの以下のサイトからにアクセスしたいのですが、やり方が分かりません。 環境はWindowsです。 とりあえず、Gitのアプリをインストールしました。 GitGUIと言うのを立ち上げて「既存のリポジトリを開く」を選択して、リポジトリに色々と指定したのですが、エラーばかりで何を指定すれば良いのか分かりません。 「http://redmin-mylyncon.git.sourceforge.net/git/gitweb.cgi?p=redmin-mylyncon/redmine-mylyn-connector;a=tree」 とか 「git://redmin-mylyncon.git.sourceforge.net」 とか 「git://redmin-mylyncon.git.sourceforge.net/redmin-mylyncon/redmine-mylyn-connector/tree」 など指定しましたが、上手くいきません。 ネットで調べて見ても、Linux環境でCUIかつローカルリポジトリでの説明ばかりで全然分かりません。 GUIでリモートリポジトリに接続してソースを取得するにはどうすれば良いのでしょうか? (一応、SVNでの経験はあります。) 以上、よろしくお願いいたします。

  • gitの開発のすすめ方について

    git clone -url- で、ローカルにリポジトリを作るまではいいのですが、 そのリポジトリで作業するべきでしょうか? それとも、さらにローカルにブランチを作って作業するべきでしょうか? 細かな変更までログに残って煩わしくなってしまわないか心配しています。 subversionは使ってましたが、 gitは初心者です。 よろしくお願いします。

  • [github]リモートリポジトリを過去に戻したい

    現在、gitでのバージョン管理を勉強中です。 自分の知識では、どうしても解決できないため、 申し訳ありませんが、git の運用をされている方に助けて頂きたいです。 githubをリモートリポジトリの場所として指定しています。 リモートリポジトリに間違ってpushをしてしまいました。 また、そのpushした物が大規模な間違いでした。 したいことは、ローカルリポジトリを過去のバージョンに戻すことではなく、 githubにあるリモートリポジトリを過去のバージョンに戻したいです。 戻すブランチはmasterではなく、masterからブランチした、 developというブランチを過去のバージョンにしたいです。 どなたか力を貸して頂けないでしょうか? また参考になるURLがあればよろしくお願い致します。

  • gitでsvnのリポジトリにコミット相当の機能

    現在githubをしています。githubサーバーにプロジェクトのリポジトリを作成して、githubのアプリケーションで自分のPCにローカルリポジトリを作成して、そこでプログラム修正を行ってコミットなどを行っていき、大体の修正が終わったので、githubサーバーのリポジトリに対してSVNのマージのようなことをしたいと思います。 このローカルのリポジトリの内容をgithubサーバーのリモートリポジトリの内容にマージするような内容をgitではなんという機能でできるのかご教示頂きますよう、よろしくお願い致します。

  • tortoise git 同じなのにアイコン赤

    windows10 で tortoise git 使ってます。 主にwebコンテンツ管理しているんですが、リポジトリ外からファイルをコピーしてリポジトリ内のファイルを上書きするとアイコンが赤いビックリマークとなり、ファイル内容何がかわったのかなとdiff取ると同じです!と同じ内容なのに変更有のアイコンになるものがあります。上書きしたすべてのファイルがなるわけではないようです。 これはいったい何なんでしょう?解消方法あれば教えてください。

  • 【Git】無視リストでもクローンさせたい。

    Git初心者です。 最近ようやくGitを導入し、TortoiseGitを使用しています。 早速質問なのですが、リポジトリから特定のファイルの 管理を除外するには無視リストに追加すればOKですが、 無視リストについてしてしまうと、クローン作成時に ファイルがクローン出来ません。 無視しているのだからクローンされないのは当たり前ですが、 出来れば日頃は差分が発生していても無視で、クローン作成時は 対象として含まれる、というような設定は不可能なのでしょうか?

  • gitのクローンのやり方

    現在、/home/myname/git というフォルダに"hoge.git"というリポジトリを作成しました。 これを現在IPアドレスが192.168.163.129なのですが、これでクローンしたいです。 現在 /rootフォルダ内で "git clone /home/myname/git/hoge.git" これでhogeプロジェクトをクローンできました。 IPアドレスで ”git clone git://192.168.163.129/myname/git/hoge.git” これで同じことをしたいのですが、 これを行うと fatal: unable to connect to 192.168.163.129: 192.168.163.129[0: 192.168.163.129]: errno=Connection refused このようなエラーがでて、できないのですが、どうやれば良いでしょうか? どうぞ、ご教示よろしくお願い致します。

  • gitでバージョン指定してダウンロードする方法教えて下さい。

    gitでバージョン指定してダウンロードする方法教えて下さい。 >svn co -r22403 svn://svn.xxxx.org/xxxx/xxxx のように、gitでバージョン指定するにはどうしますか? あと、 >git clone git://git.videolan.org/xxx.git でダウンロードした物のバージョンって、どこに出てるのですか?

  • gitを使っている人に質問です。

    gitでソース管理をしています。 gitではファイルをコミット、プッシュする用のリポジトリフォルダと、自分がローカルで作業する用の普通のフォルダ、2種類のフォルダで作業せよと教わったのですが、そうなんですか? 「Project」というフォルダを、リポジトリとしているとします。 そのコピーを「Project2」とし、ローカルでのファイルの修正はそこですると。 で、自分の修正が終わってコミット、プッシュする前に、 「Project」を最新にするためにそこで同期、プルを行います。 その後で「Project2」の中の自分が修正したファイルを「Project」の中に上書きし、その後にコミット、プッシュする。 そういう流れなんでしょうか? 滅茶苦茶分かり辛いのですが。 同じプロジェクトファイルが2つもあるなんて、ごちゃごちゃになりそうです。 上からはそういう風に指示されたけどそんなの面倒なので、「Project」の中のファイルをダイレクトに修正していました。 んでプッシュしようとしたら失敗しました。 別の人が、自分のと被らないファイルを修正したようでした。 ここで、自分がもしそのファイルを最新にせずにコミット、プッシュをしたら、自動でマージしてしまうか、私のローカルにあった古いファイルで上書きしてしまうのでしょうか??? 自分が修正したファイルだけをアップするんじゃないんですか? SVNやVSSならそうだったはずです。 GIT、意味不明です。 GITに反対します。 ご意見をよろしくお願いします。

  • 一人でもGitする価値は?

    主に一人でソフト開発している者です。 現在は、Subversionを使ってソース管理していますが、Gitが良いという話をよく聞くので乗り換えを考えています。 リモートとローカルのリポジトリの使い分けをざっくり理解したところ(だと思う)ですが、一人での開発だとGitでもSubversionでもあまり変わらないのかな?、新しい操作やコマンドを覚えるだけで終わってしまうのかなと思うと、なかなか踏ん切りがつきません。 そこで、一人で使ってもGitだとこんなことが便利とか出来るという利点があれば教えて下さい。 ちなみに、現在は開発PCは2台あり、同じプロジェクトの違う部分を別々に同時進行で修正・追加することがあります。 また、コミットの周期は短いほうだと思います。コンパイルが通らない状態でも今日の変更点のバックアップをする感覚でコミットすることもありますし、一方のPCから他方のPCへ変更点を移すためだけにコミットすることもあります。 ですので、リポジトリは汚れ気味です。ホントは、修正・変更のキリの良いタイミングだけをリポジトリに残したいのですが、Gitならそういう運用が可能でしょうか? 識者の方、ご意見をよろしくお願いします。