2009-03-26 9 views
26

CVSリポジトリの2つの異なるエクスポートをgitに持っています。彼らはある時点で発散し、なぜ私は何らかの調査をしています。開発ラインは数年前から数万件ものコミットを取り戻しています。2つのgitリポジトリを比較するにはどうすればよいですか?

開発ラインの始めには、コミットごとのSHA1 IDが同じで、git-cvsimportはcvspsとimportの結果を読み込んだときの動作について非常に一貫していることがわかります。

ただし、最初のコミットと昨日の間に、SHA1 IDが発散し始めます。私は、各リポジトリのコミットIDのリストを比較し、何が欠落しているかを調べることによって、これがどこにあるのかを知りたいと思います。これを行うための良いツールやテクニックはありますか?

答えて

16

それぞれのリポジトリのgitログを独自のファイルに記録して比較するのはなぜでしょうか?ファイルの最後に最も近い差は、発散し始めた場所です...

+0

これは実際には私が昨日やっていたことですが、今日はもう少し進んでいきます。 – skiphoppy

+3

2つのリポジトリが分岐し始める場所は、その分岐以降に作成された相違点を教えてくれるからです。 – masukomi

+0

申し訳ありませんが、それは質問の内容ではありません。問題は、どのように2つのレポを比較するかです。答えは以下の通りです。 – awm

6

明白な方法は、1つのリポジトリを複製し、他のリポジトリのメインブランチの先端をクローンにフェッチし、共通の祖先を見つけるためにgit merge-baseを使用することです。

30

2つのgitリポジトリが同じものから始まるので、両方を同じ作業リポジトリに引き出すことができます。

あなたのレポの一つで
$ git remote add cvsimport-a git://.../cvsimport-a.git 
$ git remote add cvsimport-b git://.../cvsimport-b.git 
$ git remote update 
$ git log cvsimport-a/master..cvsimport-b/master # in B, not in A? 
$ git log cvsimport-b/master..cvsimport-a/master # in A, not in B? 
+0

これらのコマンドでは、おそらくcvsimport-a/masterとcvsimport-b/masterが必要になります。また、xargs git fetchにパイプするのではなく、 "git remote update"を実行することもできます。 –

+0

私はもともと 'git remote fetch cvsimport-a;を書くつもりでした。 git remote fetch cvsimport-b'(他のリモコンを更新していない)が、その後私は気が変わった。あなたが/ masterを離れると、Gitは少し文句を言うが動作する。私はそれを分かりやすくするために変更します。 – ephemient

12

、次の手順を実行します。

$ git remote add other-repo git://.../other-repo.git 
$ git remote update 
$ git log other-repo/master...master 
    # or maybe: 
$ gitk master... other-repo/master 

これは、次の2つのリポジトリ間の対称差を与えます。これは1つのレポにあるすべてのコミットを表示しますが、他のレポは表示しません。

0

あなたはephemientチャールズ・ベイリーブライアン・キャンベルによって応答のように、新しいもの、または既存の1のいずれか、単一のリポジトリに(フェッチ)の両方のリポジトリを置くことができます。または、Git WikiのTips and Tricksページのトリックを使用するか、より正確には「2つのローカルリポジトリを比較する方法」を参照してください。

しかし、 "git rev-list"(または適切なオプションを指定して "git-log")を使用して、コミットのSHA-1のリストをトポロジカルな順序で生成し、それらが異なる最初のリビジョンを確認する方が簡単かもしれません。

+0

ヒントとトリックのリンクは「見つからない」、移動したのか、それともなくなったのでしょうか? – Chris

+0

Git Wikiはhttp://git.or.czからhttp://git.wiki.kernel.orgに最初に移動しましたが、kernel.orgへの侵入後2度目はまだ戻っていません。 beack there、またはhttp://git-scm.comのどこかで) http://git.wiki.kernel.orgは読み取り専用モードであり、すべてのリンクが変更されました。 ** Tips and Tricks **(別名** GitTips **)は、こちらから入手できます:https://git.wiki.kernel.org/articles/g/i/t/GitTips_81aa.html –

0

私は最近同様の必要性がありました。私は現在のコピーされたコードベースと比較する必要があったクローンのリモートプロジェクトを持っていました。コミットには何も共通していなかったので、gitログは関係ありませんでした。同じコードベースから分岐しているかどうかはわかりませんでした。

問題を解決するために、私はgitを無理矢理使用しました。チェックするファイルをgit repoにコピーして、git statusにリストの変更されたファイルをチェックしました。

さらに、git diff <filename>を使用してさらに検査することもできます。私はファイルを比較することができました

関連する問題