2016-07-03 2 views
0

正確な内容(100%一致)でgit repo上のファイルを検索する方法を見つけようとしています。このシンプルなシナリオがあるとします:git repoで正確な内容の正確なファイルを見つける方法は?

  • ローカルで新しいgit repoを作成します。コンテンツ "1"のテキストファイル名: myFile.txtを作成します。そしてそれをレポにコミットしてください。単純な例の の場合、SHA-1ハッシュの最初の4文字は "1111"です。

  • 次に、内容「2」でmyFile.txtを変更し、 レポにコミットしました。 SHA-1は「2222」になります。

  • 次に、内容「3」で再度変更してレポをコミットします。 SHA-1は "3333"になります。

  • ここで、ファイルを変更して内容を1にしました。

は、どのように私は知っていることができるようになります(この時間は、私はまだコミットされません)がコミットmyFile1.txtは、以前のすべてのコミットで同じ内容を持っているのでは?それをする命令はありますか?例えば

git-find-the-file myFile.txt 
output: The same file is on commit "1111" 

テキストとバイナリファイルの検索に使用します。私の実際のアプリケーションは、100以上のコミットを持つGit Repoで同じ単語文書を探しています。

ありがとうございました。

答えて

1

次のコマンドを使用して、そのファイルに関連するすべての変更を表示できます。

gitk myFile.txt
+0

こんにちは、gitkは私のために何か新しいものでした。私はそれを現在演奏しています。私は私の質問を編集し、私がそれを使用する場所に情報を追加しましたが(Gitリポジトリに同じワード文書ファイルを100件以上コミットしています)。私は今Gitkでテストを行います。ありがとう –

1

git log --raw --abbrev=40 --pretty=oneline | 
    grep -B 1 `git hash-object filename` 

参照してみてください:あなたは、むしろ現在のworktree内容よりも、最後の段の別名最後に追加されたコンテンツに対してチェックしたい場合は、のためにgit rev-parse :myfile.txtに置き換えGit User Manual-Finding commits referencing a file with given content

+1

'--raw'オプションはここでかなり甘いですが、ファイルが最初に変更されていなければgrepが失敗すると思います。' 'git log --raw --abbrev = 40 --pretty =% H | awk 'NF == 1 {コミット= $ 1} $ 4 ==ハッシュ{プリントコミット}'ハッシュ= 'gitハッシュオブジェクトmyfile.txt'' ' – jthill

+0

@jthillはそれを指摘してくれてありがとう。今はコンピュータにアクセスできないので、答えを確認できたら更新します。 – ElpieKay

+0

@jthillは完璧でした。私はビットマップファイルでそれを試して、それが正しく返されます。まさに私が探していたものです。 $ git log --raw --abbrev = 40 --pretty =%H | awkのNF == 1 {= $ 1をコミット} $ 4 ==ハッシュ{印刷がコミット} 'ハッシュ= 'Gitのハッシュオブジェクト 0b95661c89b0c0b2a65acc3abeaf0707f1474a46 0d681eeda1b6add2912657ad8a084fef92097fd2 a.bmp'ありがとうございました。コミットされたファイルとコミットされていないファイルの両方で動作します。 –

0
myfile=`git hash-object myfile.txt` 
git rev-list HEAD | while read rev; do 
     [[ `git rev-parse $rev:myfile.txt` = $myfile ]] && echo $rev 
done 

をハッシュオブジェクト

0

個人的な挑戦として、Python gitモジュールを試してみるために、これを行う小さなPythonプログラムを作成しました。最初にPython gitモジュールをインストールし、それを "findFile.py pathToRepo pathToFileToFind"として実行すると、リポジトリにすべてのコミットと見つかったファイルのパスがリストされます。これは、ファイルのすべてのインスタンス(ファイルのSHAに基づいて検索するため名前が変更された場合でも)と、リポジトリ内の任意のパスで検出されるはずです。

これはhttps://github.com/dneiss/findFileです。

関連する問題