1

次のことが起こったSVNプロジェクトを修正しようとしています:

フィーチャー ブランチがトランクから取得されました。このブランチへの定期的なコミットがありました。ブランチをトランクにマージするときが来たとき、開発者は SVN マージではなく WinMerge (!) を使用したため、これに関するすべての履歴が失われました。さらに、WinMerge のマニュアルでは見落とされていた小さなバグ修正がいくつかありました。これは数週間前に発生し、それ以来トランクへのコミットが定期的に行われているため、単純に元に戻すことはできません。

だから、私は戻ってマージを正しくやり直そうとしていますが、これは私が思っていたよりも複雑であることが証明されています...

この「BadMerge」の前の時点に戻してから適切なマージを行おうとすると、BM の後に発生した他の変更を再マージできません。

なので、これと同じように svnadmin dump と load を使う必要があると思いますが、何をする必要があるのか​​正確にはわかりません。

  1. BM (ChangesetX) の前に変更をダンプします。
  2. BM 後の変更をダンプします (ChangesetY.
  3. ChangesetX を何にロードしますか? 新しいレポ?
  4. これを適切にマージします
  5. ChangesetY をロード

これは可能ですか?どんな助けでも大歓迎です。

ありがとう

トム

4

3 に答える 3

1

あなたができることは次のとおりです。

  1. その開発者にSVNの本を、できれば重い種類の紙に印刷した形で投げてください。(彼がなんとかそれを生き残ることができれば、彼を解雇します。)

  2. SVNがマージのモードを通過し、どのリビジョンがファイルとフォルダーのプロパティにマージされたかを記録するオプションがありますが、実際にはファイルを変更しません。(SVNバブルの使用:「プロパティステータス」は「変更」されていますが、「テキストステータス」は変更されていません。)

しばらくSVNコマンドラインを使用していないので、これを使用する方法がわかりませんが、TortoiseSVNには次の機能があります。

ここに画像の説明を入力してください

于 2011-03-09T14:16:08.760 に答える
1

おそらく最もエレガントな方法ではありませんが、クライアント側で実行できます。

  • svn export トランクの HEAD をディレクトリ A に
  • トランクのsvn checkout BAD_COMMITをディレクトリBに
  • ファイルを A から B にコピーする

B には、 BAD_COMMIT の後のすべてのコミットがローカルの変更として含まれるようになりました (これらのコミット間の区別が失われます)。

今:

  • svn checkout トランクの BAD_COMMIT-1 をディレクトリ C に
  • ブランチのsvnマージを行い、トランクのブランチの開始点を作業コピーCにします
  • CをAにコピー

これで、HEAD へのローカル変更としてディレクトリ A に正しいマージができました。Commit A. Trunk は HEAD として正しいマージを行うようになりました。

ついに:

  • svn update B を HEAD に
  • 競合を解決する
  • コミット B

この時点で、正常なマージと、不適切なマージ後のすべての変更をコミットしました。いくつかの履歴が失われますが、サーバー側でダンプを操作するよりも手間がかかりません。

幸運を!

于 2011-03-09T14:13:08.890 に答える
0

バージョニング ツールが common base であると考えるものに限定されるわけではなく、sbiが示唆するようにマージを記録することはおそらく良い考えです。他のすべてが失敗した場合は、ファイルの 3 つのバージョンをチェックアウトし、上記の回答で説明されているように、KDiff3を直接使用することで、いつでも手動でマージを行うことができます。

バージョン X と Y がフィーチャー ブランチからのもので、バージョン A から E がトランク上にある場合、

    A----------+
    |          |
    |          |
   \_/        \_/
    B          X
    |          |
    |          |
   \_/        \_/
    C <======= Y   Merge without being recorded by svn as a merge (right?), aka BadMerge
    |
    |
   \_/
    D
    |
    |
   \_/
    E

次に、マージをやり直すためにバージョンAをチェックアウトし、kdiff3 とマージしますYBこれにより、できれば で導入されたバグがない新しい C' バージョンが得られますC。次に、残りの変更をトランクで行う必要があるためC'Cと をマージしEます。これにより、 version としてチェックインできる新しいバージョンが得られるはずですF

チェックイン方法とその処理方法についてアドバイスできるほど svn については詳しくありませんC'が、上記の手順を実行すると、少なくとも目的の結果が得られるはずです。

于 2011-03-10T09:13:44.517 に答える