何千ものファイルと何千ものコミットがあるときには実行できない、多くのアイデアが素朴なものから始まります(私は各revをチェックアウトし、diff -rUN
を実行してdiffstatします。 (私はすべてのファイルに対してWhich commit has this blob?を実行してコミットし、データベースに入れていくつかのクエリを書く)実際に実行可能なものにリンクされた答えに基づいて緩やかに処理する。
まず、現在のファイルのハッシュを保存し、それを比較して、指定されたコミット内のすべてのブロブのハッシュをリストし、マッチをスコアリングするというものです。
- 採点プログラムは、単に
grep
あり、それは文字列のリスト読み取ることができます(でもパターンが、我々は、文字列を持っている)と、それらの文字列を入力して発生回数を数えます。
git ls-tree -r
はコミットにブロブハッシュをダンプします(そしてより多くのが、我々はそれを気にしないでください)
git hash-object
は、既存のファイルのためのgit ls-tree
と同じハッシュを生成します。
私はtmpfsを使用しましたが、早すぎる最適化はすべての悪の根源になるかもしれませんが、この最適化のコストはそれほど高くありませんでした。私はルートにこのスクリプトを持っていた:
#!/bin/sh
echo "$(git ls-tree -r $1|grep -c -F -f ../hashes.txt) $1"
とbase
下mess
の下で問題のあるコードベースと手付かずのgitのクローンを置きます。
cd mess
find . -type f -print0| xargs -0 -P8 git hash-object >> ../hashes.txt
cd ../base
git log --all --format=%H |xargs -n1 -P8 ../script.sh |sort -n|tail
これは数分で終了した(しかし、私はそれはあなたがあまりにもそれらを持つことになりそうだ、私はgit log
にいくつかの日付の制限があったので少しだまさが、ユースケースを与えられました)。私の出力は次のようになります。
9548 0ceb441a75cd4cd11427da2b37efd49c99f9e562
9549 8f2c0537da72bb7ca866e6847bf887811ab3c72e
9550 5cd36afbe23310c17caf4075d29c70a4b2252295
9550 8da13e6c60255d2b8008d8de3d3e64de91d2bf7a
9551 2be39c73876f9d22f8cea40777d082e3fba4cbd4
明らかに2be39c7
は9551個の一致するファイルを持っており、それが「neigbhouring」のコミットなど、いくつかの壊れた外れ値は非常に似ていますが、下の数字を持っていません。
出典
2016-11-25 03:46:02
chx
コンサルタントの観点からは、法的問題のために見つけなければならないもの、またはこれが責任の原因であるかどうかです。 – Makoto
いいえ、それは掃除の問題です。 – chx
Gitを掘り下げて、この特定のファイルを単純に書き直すよりもコミットを見つけるのに時間がかかるのだろうかと思っていますが、私はそれ以上あなたの理論的根拠に同意しません。 – Makoto