質問

Gitリポジトリ(多かれ少なかれプロジェクトの履歴をカバー)と、しばらく前に分岐した個別のソース(ファイルが少ないタールボール)があります(実際には2004年または2005年のどこか)。

Tarballの情報源は、いくつかを組み込みたいと思っている多くの変更を受けています。さて、問題は - 実際に変更されたソースの分岐点であるかを知る方法は、そこで起こったことを最小限に抑えるためです。

ですから、基本的に私が望んでいるのは、コードが私が持っているソースのターボールに最も似ているgitの歴史の中で場所を見つけることです。そして、私はそれを手動でやりたくありません。

また、変更されたソースにはファイルのサブセットのみが含まれ、いくつかのファイルをさらに分割したことに言及する価値があります。ただし、そこにあるコードは、小さな変更といくつかの追加しか得られないようです。

自分で遊んでみたい場合は、ソースのあるターボールは ここ Gitはでホストされています gitorious: git://gitorious.org/gammu/mainline.git

役に立ちましたか?

解決

一般的なケースでは、実際にはすべてのコミットを調べる必要があります。なぜなら、次の違いに大きな差があるかどうかを知る方法がないため、別の巨大な違い、そしてミディアムディフ...

あなたの最善の策は、おそらく特定のファイルに自分自身を制限することです。単一のファイルのみを検討する場合は、そのファイルのすべてのバージョンを繰り返すのに時間がかかることはありません(使用してください git rev-list <path> リストを取得するには、すべてのコミットをテストする必要はありません)。ファイルを変更した各コミットについて、DIFFのサイズを確認し、最小限をかなり迅速に見つけることができます。少数のファイルのためにこれを行い、うまくいけば彼らが同意するでしょう!

ディフェンスのために自分自身をセットアップする最良の方法は、タルボールでコピーするだけで一時的なコミットを行うことです。 tarball 比較する。そうすれば、これを行うことができます:

git rev-list path/to/file | while read hash; do echo -n "$hash "; git diff --numstat tarball $hash path/to/file; done

Diffサイズですべてのコミットの素晴らしいリストを取得するには(最初の3つの列はSHA1、追加の行の数、および削除された行の数になります)。その後、パイプでパイプできます awk '{print $1,$2+$3}' | sort -n -k 2, 、そして、あなたはコミットとそれらの違いのソートされたリストを持っているでしょう!

テストするために少数のファイルに自分自身を制限できない場合、私はそれに似た何かを手運ぶように誘惑されるかもしれません git-bisect - 小さな違いに絞り込むようにしてください。おそらく、あなたの最高のケースに近づくこともより小さく、それからそれから遠く離れて違いが大きくなると仮定してください。 (ニュートンの方法とバイナリ/グリッド検索のフルの間のどこか?)

編集:別の可能性、提案されています ダグラスの答え, 、いくつかのファイルがそうであると思われる場合 同一 コミットしている人には、それらを使用してハッシュすることです git-hash-object, 、そしてあなたの歴史の中で何がコミットしているかを見てください。あります いくつかの優れた答えで質問 それを行う方法について。ファイルを少数のファイル(できれば頻繁に変更したファイル)でこれを行うと、ターゲットコミットをかなり速く絞り込むことができるかもしれません。

他のヒント

素晴らしい解決策ではありませんが、どの修正があるかを推測するためには、タールボールのファイルの一部が分岐してから変更されていないと仮定します。走る gitハッシュオブジェクト Tar Ballの各ファイルに対して、リポジトリ内のこれらのファイルを使用して検索します Git Show. 。次に、これらのファイルが含まれているコミットを試してみてください。 git whatchanged. 。あなたの質問に対する答えは、最も一般的なファイルでのコミットかもしれませんが、それはまだ少しヒットし、ミスになります。

Araqnidが言ったことに基づいて、私は9C6C864426BF88429E77C7E22B5AA78E9295B97A(0.61.0とHeadの間のものを求められたばかりです)を思いついたのですが、これはおそらく最高ではありません)

git rev-list --no-merges --all | while read rev; do patchsize=$(git diff $rev | wc -c); echo $patchsize $rev; done | sort -n | less

Tarballをgitにインポートし、その改訂をチェックアウトしていると仮定します(私はこれをdrivingして、それからこれを行いました

git init
git add .
git commit -m "import tarball"
git remote add origin git://gitorious.org/gammu/mainline.git

したがって、それを行い、上記を実行した後、パッチサイズの昇順ですべてのディフのサイズを出力するはずです(現在の頭が見つかるため、最初の違いは0です)。しかし、それは最小の違いを見つけるはずです...

フォークはどのように作られましたか?それは他の誰かが作ったクローンであり、それから彼ら自身の仕事をしましたか?もしそうなら、これは本当に簡単です。あなたがする必要があるのは、フォークからコードを引き込むローカルブランチを作成することです。 GITでは、元のリポジトリからのコミットの1つを指しているフォークされたブランチの祖先が表示され、「ドットを接続する」というべきことになります...履歴を元のリポジトリからフォークに再接続します。

あなたはこれを行うことができるはずです:

git remote add thefork git://wherever.it.lives/thefork.git

git fetch thefork

git branch -f thefork-branch thefork/branchname

git checkout thefork-branch

この時点で、実行できます gitk そして、フォークされたブランチとあなたのローカルリポジトリの完全な履歴を見て、それらが接続しているかどうかを確認してください。

タルボール内のファイルをGit Revisionにインポートし、別のブランチまたは完全に新しいブランチにインポートします。リビジョングラフの位置は重要ではありません。ツリーとして利用できるようにします。

マスターの各改訂について、そのツリー/リビジョン(「インポート」)に対してdiffだけで、diffの大きさを出力します。何かのようなもの:

git rev-list master | while read rev; do patchsize=$(git diff $rev imported | wc -c); echo $rev $patchsize; done

したがって、パッチサイズが最小の修正は、非常に粗い経験則による「最も近い」ものになります。 (同一の改訂は0のパッチサイズを生成し、他のすべては確かにゼロではなく、変化するほど大きくなります)。

フォークが発生した場所について大まかなアイデアがある場合は、Will Manley'sの使用を検討してください git meld. 。 (参照: 融合の違いを融合しますか?.)

これを行うには、ターボールの内容をリポジトリに追加します(とにかくこれを行うことができます)。 Meldをインストールした後 git-meld, 、 走る

git meld branch_from_tarball commit_to_check &

異なるコミットでは、違いが最も少ないものを見つけるまで。このコマンドが開きます meld 指定されたコミット間のディレクトリツリーの変更を表示し、同一のファイルが隠されています。画面の例:

2つの非常に異なるコミットを示すメルド:
Very different

2つの同様のコミットを示しています:Similar

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top