3

foogit にコミットされていない任意のファイルがあります。

履歴全体が git に保持されているファイルもありますbar

がこれまでに存在したfooバージョンと同一であるかどうかを判断するにはどうすればよいですか?bar

4

2 に答える 2

4

ファイルの内容が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

(注: 断片的なものを除いてテストされておらず、時折ビットが途中で再入力または変更されている可能性があります。タイプミスやばかげたエラーに注意してください)

于 2013-10-16T08:18:45.597 に答える
1

と の組み合わせを使用すると、次md5sumのように機能します。git loggrep

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 します

于 2013-10-16T07:52:14.073 に答える