5

これは私の以前の質問へのフォローアップです。

cvsps の出力 (~/.cvsps ディレクトリに保存) に目を通すと、主要で複雑なコミットのパッチセットが表示されます。しかし、既存の git リポジトリを更新するために cvsimport を実行すると、このコミットは表示されません。git-cvsimport は、不完全な CVS コミットのインポートを避けるために、10 分より新しいパッチセットを無視することを知っています。関連するブランチを特定できないパッチセットをスキップするとも聞いたことがあると思います。git-cvsimport がコミットを無視する原因として考えられるその他の理由は何ですか? どうすればこれをデバッグできますか?

以下は、cvsps の出力の一部です。

patchset: 50064
date: 1238445635
author: skiphoppy
tag: 
tag_flags: 0
branch: HEAD 
branch_add: 1
descr:
My log message

-=-END CVSPS DESCR-=-
members:
file:ordinaryChangedFile; pre_rev:1.44; post_rev:1.45; dead:0; branch_point:0
file:newFileRenamedAndModifiedFromOldFile; pre_rev:INITIAL; post_rev:1.1; dead:0; branch_point:0
file:deletedFileGoneBecauseRenamed; pre_rev:1.2; post_rev:1.3; dead:1; branch_point:0
...

その branch_add: 1 行は何か関係がありますか? リポジトリ全体でそのようなコミットは 9 つしかありません。他の 50090 コミットは branch_add: 0 と言っています。それ以外は、cvsps または git-cvsimport の観点からの違いはわかりません。コミットは複雑で、いくつかのファイルの名前を変更し、関連するコンテンツを変更する必要がありました。CVS で処理するのは明らかに困難です。もちろん、git にとっては簡単ですが、実際のバックエンドが CVS の場合、git が処理するのは困難です。

同じタイプの複雑なコミットをあと 3 回実行する必要があり、cvsimport がコミットを表示できないため、CVS から真新しい git リポジトリを再インポートするたびに 4 時間半を費やす余裕はありません。 .

さらに重要なことに、毎日の git-cvsimport の実行 (これを cron に入れるか、または 5 分ごとに実行するデーモンを作成するつもりでした) が、将来コミットを見逃す可能性があるという事実に怯えています! これらのコミットを取得するために既存のリポジトリを git する方法が見つかりませんでした。まったく新しいリポジトリで git-cvsimport を実行することしかできず、永遠に待つことができます。その間、他のブランチの多くを使用できなくなります。

4

4 に答える 4

7

さて、これが問題かもしれません。私の git-cvsimport 行は次のようになります。

git cvsimport -p x ...

-px は -x オプションを cvsps に渡して、以前の実行から残ったキャッシュされた出力を無視するように指示することになっています。そうする主な理由は、不完全かもしれない最後のいくつかのパッチセットが破棄され、次に実行するときに完了するためだと思いました。修正される問題が他にもある可能性があり、これはそのうちの 1 つかもしれません。

このブログ エントリから、この方法で git cvsimport を実行する方法を学びました。このブログ エントリは、現在 Google で「git cvs」のヒット数が最も多いものの 1 つです。cvsps からの出力に対して Perl デバッガーを介して git-cvsimport を実行しようとした上記のプロセスでのみ、どの引数が実際に cvsps に送られるかを確認する必要がありました。cvsps が次のように実行されていることを知りました。

cvsps --norc x --cvs-direct ...

それ以外の:

cvsps --norc -x --cvs-direct ...

そして、-x の代わりに x を渡すと、cvsps から異なる出力が得られることを実験的に確認しました。マーフィーの法則のおかげで、cvsps はこれが問題であったことを報告していないようで、git-cvsimport はそれを確認しません。

とにかく、git cvsimport は次のように実行する必要があります。

git cvsimport -p -x ...

このリポジトリの私の以前のバージョンは、この時点で完全にホースになっていますが、最後の問題のコミットをそれらに強制することができました (ただし、以前のコミットの一部は欠落しています)。それで、もう一度 4 時間のインポート プロセスを実行する必要があります。

最後のヒント: Windows での git-cvsimport はまったく機能していないようです。プロジェクトの現在の状態に似たツリーになってしまいましたが、コミット数は 10% 未満でした。ほとんどすべての歴史が欠けているようです...

于 2009-04-02T14:16:35.057 に答える
3

どうもありがとう!私は同じ問題を抱えていて、あなたの助けを借りてそれを修正することができました!

cvsimport をゼロから再実行するのを避ける方法さえ見つけました。'master' と 'origin' ブランチを古い git コミットに設定するだけで、欠落しているパッチを含むため、cvsimport はパッチを再インポートしました。

不足しているコミットよりも古いコミット ID を見つけます。

git ログ

'origin' がそのコミットを指すようにする

git ブランチ -f オリジン

origin に切り替えます ('master' が現在の HEAD ではないように)

git チェックアウトの起点

「マスター」が古いコミットもポイントするようになりました

git ブランチ -f マスターオリジン

マスターに戻す

git チェックアウト マスター

これで、時間が完全に巻き戻され、今度は適切に cvsimport を再度実行できます

git cvsimport ...

于 2010-03-17T13:40:40.820 に答える
1

私は最近そのようなことに遭遇しました - git cvsimport の後に git に表示されない CVS のコミットがありました。その後のコミットはそうでした(その後、動作しないパッチを作成したため、私は苦労しました。

しかし、修正は単純でばかげていました。欠落しているコミットの前に cvs/master ブランチをリセットし、git cvsimport を再実行しただけです。

于 2009-03-31T21:27:53.800 に答える
-1

うーん、良いニュースは、git-cvsimportがPerlで書かれているように見えることです。私はたまたま、Perlプログラマーなので、少なくともPerlデバッガーを使って、そのコミット中に何が起こるかを調べることができます。

これを試したい人は、git-cvsimportへのフルパスを見つけて、-dスイッチを使用してperl(Perlインタープリター)にフィードする必要があります。

perl -d /usr/local/libexec/git-core/git-cvsimport

私はこれを行うために他のすべてのオプションがうまくいったわけではありませんが...私はgit-cvsimportにcvspsの出力を直接フィードする必要があると思います...

于 2009-03-31T21:38:37.207 に答える