16

マージ トラッキングを備えた SVN が機能するときは、本当に素晴らしく、気に入っています。しかし、それはねじれ続けます。TortoiseSVN を使用しています。次のメッセージが継続的に表示されます。

エラー: 再統合は、リビジョン 1234 ~ 2345 が以前に /Trunk から再統合ソースにマージされた場合にのみ使用できますが、そうではありません

参考までに、これは私たちが使用している方法です:

  1. ブランチを作成する
  2. ブランチで開発する
  3. トランクからブランチまでのリビジョンの範囲を時々マージする
  4. 枝が安定したら、枝から幹に枝を再統合する
  5. ブランチを削除する

再統合操作の直前に、トランクからブランチにリビジョンの範囲をマージします(範囲を空白のままにするため、すべてのリビジョンにする必要があります)。これにより、ブランチはトランクと適切に同期されます。

現在、トランクには複数の SVN マージ追跡プロパティが関連付けられています。それはすべきですか?それとも、再統合はマージ追跡情報を追加すべきではありませんか?

私たちのプロセスに何か問題がありますか? これにより、SVN が使用できなくなります。3 回の再統合ごとに 1 回、マージ追跡情報に飛び込んでハッキングする必要があります。

4

4 に答える 4

10

この問題は、過去にトランクからブランチへの部分マージが行われた場合に発生することがあります。部分マージとは、ツリー全体に対してマージを実行し、その一部のみをコミットすることです。これにより、ツリーの残りの部分と同期していない mergeinfo データを持つファイルがツリー内に表示されます。

上記の--reintegrateエラー メッセージには、svn で問題が発生しているファイルが一覧表示されているはずです (少なくとも svn 1.6 では問題が発生しています)。

次のいずれかを実行できます。

  1. エラー メッセージの範囲を使用して、問題のあるファイルをトランクからブランチに手動でマージします。注: 範囲の先頭から 1 を引く必要があるため、実行するコマンドは次のようになります。

    cd <directory of problem file in branch working copy>
    svn merge -r1233:2345 <url of file in trunk>
    svn commit
    

    また

  2. ブランチ内のファイルの内容が正しいと確信していて、ファイルをマージ済みとしてマークしたいだけの場合は、--record-onlyフラグを使用して次のことができますsvn merge

    cd <directory of problem file in branch working copy>
    svn merge --record-only -r1233:2345 <url of file in trunk>
    svn commit
    

(ツリー全体で使用できると思いますが--record-only、試したことはありません。トランクから来る必要がある実際のマージがないことを絶対に確認する必要があります)

于 2010-09-22T15:04:15.907 に答える
3

あなたの問題は、「半分のマージ」がすでに行われているために「破損」したブランチで再統合マージを使用しようとしていることです。私のアドバイスは、再統合を無視し、これがあなたのワークフローである場合は、リビジョンのマージについてプレーンに固執することです。

ただし、エラーが発生する大きな理由は、SVN がいくつかのチェックを実行しているためです。この場合、マージに個々のファイルからの余分なマージ情報がある場合、svn はぐらつきをスローし、マージを妨げます。これは、svn reintegrate 用語でサブツリー マージと呼ばれます (Reintegrate to the Rescue セクション、特に物議を醸している最後の reintegrate チェックを読んでください)。

中間マージを実行するときにmergeinfoの記録を停止するか、準備が整うまでブランチをそのままにしておくことができます。その後、マージはトランクに加えられた変更を取得します。個々のファイルではなく、トランク全体をブランチにマージするだけで、このチェックを回避することもできると思います。これにより、最後の最終的な再統合のためにmergeinfoを安全に保つことができます。

編集:

@randomusername : (あまりよく見たことがない) 移動は、「部分マージ」の罠に陥ると思います。SVN の優れた機能の 1 つは、スパース チェックアウトを実行できることです。つまり、ツリーの部分的なコピーのみを取得します。部分的なツリーをマージすると、SVN は全体がマージされたとは言えないため、マージ情報はわずかに異なって記録されます。再統合はすべてをマージする必要があるため、これは再統合には役立ちませんトランクに戻ると、一部のビットがマージされずに変更されていることがわかり、文句を言います。移動も同じように表示されます。分岐ツリーの一部が、mergeinfo で予想とは異なって表示されるようになりました。私は再統合を気にせず、通常のリビジョン範囲のマージに固執します。良いアイデアですが、あまりにも多くの異なる状況で、あまりにも多くのユーザーに対してあまりにも多くのことをしようとしています.

mergeinfoの完全なストーリーはここにあります。

于 2010-05-31T23:39:34.190 に答える
3

バニーホッピングが解決策かもしれません。

基本的に、トランクからこれらの変更をプルする場合は、トランクの変更を単一のブランチ (branches/fooと呼びましょう)に継続的にマージする代わりに、次のようにします。

  1. トランクを新しいブランチにコピーします ( branches/foo2)。
  2. 古いブランチからの変更をマージします ( にマージbranches/fooしますbranches/foo2)。
  3. 古いブランチを削除します (delete branches/foo)。
于 2010-05-12T15:30:23.250 に答える