foo
git にコミットされていない任意のファイルがあります。
履歴全体が git に保持されているファイルもありますbar
。
がこれまでに存在したfoo
バージョンと同一であるかどうかを判断するにはどうすればよいですか?bar
foo
git にコミットされていない任意のファイルがあります。
履歴全体が git に保持されているファイルもありますbar
。
がこれまでに存在したfoo
バージョンと同一であるかどうかを判断するにはどうすればよいですか?bar
ファイルの内容がfoo
リポジトリのどこかに表示されているかどうかは簡単にわかります。
file=foo # or argument to script, etc
sha1=$(git hash-object -t blob $file)
repotype=$(git cat-file -t $sha1 2>/dev/null) || {
echo "file \"$file\" is not in the repo"
exit 1
}
[ $repotype = blob ] || {
echo "uh oh: file \"$file\" matches non-file ($repotype) object"
exit 1
}
ただし、foo
リポジトリに blob として表示されるからといって、それが名前の下に表示されるわけではありませんbar
(または、まったく表示されない可能性がありますgit add
。編集された可能性がありますが、コミットでチェックインされたことはありません)。それでは、すべての (妥当な?) コミットを見て、ターゲット パスの blob-ID を抽出し、そこにない場合はコミットをスキップします。
target_path=bar
git rev-list --branches | # or --all, or HEAD, or (etc)
while read id; do
file_id=$(git rev-parse -q --verify $id:$target_path) || continue
[ $file_id = $sha1 ] || continue
echo "found \"$file\" as \"$target_path\" in $id"
# do more here if you like, e.g., git show $id
done
特定の明示的な名前ではなく、任意の名前で検索したい場合は、すべての を検索してそれらの ID を確認するgit ls-tree -r
ようにコミットできます。blob
(注: 断片的なものを除いてテストされておらず、時折ビットが途中で再入力または変更されている可能性があります。タイプミスやばかげたエラーに注意してください)
と の組み合わせを使用すると、次md5sum
のように機能します。git log
grep
for SHA in `git log --pretty=format:"%h" bar`; do
git show $SHA:bar | md5sum
done | grep `md5sum foo| cut -d' ' -f1`
上記のコマンドは、ファイルgit log --pretty=format:"%h" bar
のすべてのコミットのリストを取得し、bar
それぞれに対して md5sum を実行します (git show
そのコミットのファイルを表示するため)。最後に、foo
ファイルの md5sum を grep します