web-dev-qa-db-ja.com

SVNは、ファイルが2つのブランチに追加されたときに新しいツリーの競合を解決する方法

(SVN 1.6.1を使用して)両方のブランチにファイルが追加された(そしてそれらの別々のブランチで作業した)いくつかのブランチをマージすると、新しいツリーの競合の1つが発生します。

      C foo.txt
  >   local obstruction, incoming add upon merge

両方のブランチからの変更が必要ですが、ツリーの競合は通常の.working、.merge-leftおよび.merge-rightファイルを提供しません-これは競合の性質上理解できるものです。これらの競合にはかなりの数があり、各ブランチで同じファイルの削除が発生しましたが、簡単に解決できます。

この問題を解決するにはどうすればよいですか? SVN redbeanの本(1.6用)では、このような状況をカバーしていません。

95
DEfusion

"Tree Conflict"デザイン ドキュメントの古いバージョン(2009)で言及されているように:

上書きバージョン管理ファイルのマージによるXFAIL競合

このテストでは、マージを実行して履歴のないファイルを既存のバージョン管理されたファイルに追加します
これは、 'local obstruction, incoming add upon merge'種類のファイルでのツリーの競合です。 r35341の期待を修正しました。

(これは、ClearCaseでは「邪悪な双子」とも呼ばれます):
2つの異なるブランチに2回(ここでは2回「追加」)ファイルが作成され、2つの異なる要素の2つの異なる履歴が同じ名前で作成されます。

理論的な解決策は、目的のブランチ「B2」にそれらのファイルを手動でマージすることです(外部diffツールを使用)。

まだソースブランチで作業している場合、理想的なシナリオは、そのファイルをソースブランチから削除し、B1からB2からB1にマージして、そのファイルを表示することです。 on B1(その後、同じ要素で作業します)。
_B1からB2へのマージのみが発生するため、マージバックできない場合は、B1->B2マージごとに手動マージが必要になります。

40
VonC

その解決策を提案する投稿 を見つけました。実行しようとしています:

svn resolve --accept working <YourPath>

これは、ローカルバージョンファイルをOKとして要求します。
単一のファイルまたはプロジェクトカタログ全体に対して実行できます。

160
lukmdo

入ってくる変更があなたが望むものである場合はどうですか? svn resolveを実行できません--theirs-fullを受け入れます

svn resolve-ベースを受け入れます

9

上記のuser619330のアドバイスに従おうと、かなり徹底的に自分自身をくじけました。 (1):最初のブランチbranch1で作業中にいくつかのファイルを追加しました。 (2)さらなる開発のために新しいブランチbranch2を作成し、トランクから分岐して、ブランチ1から変更をマージしました(3)同僚がブランチ1から自分のmodを自分のブランチにコピーし、さらにmodを追加しました。その後、トランクにマージされます。 (4)トランクからの最新の変更を現在の作業ブランチbranch2にマージしたいと考えました。これはsvn 1.6.17でのものです。

マージは新しいファイルとツリーの競合があり、それらが異なるトランクから新しいバージョンが必要だったので、branch2のクリーンコピーから、競合するファイルのsvn削除を行い、これらのbranch2の変更をコミットしました(したがって一時的な問題のファイルのないbranch2のバージョン)、トランクからのマージを行いました。これは、後でトランクにマージするときに問題が発生しないように、履歴をトランクのバージョンと一致させたいためです。マージはうまくいき、トランクバージョンのファイルを取得し、svn stはすべて正常に表示され、その後、以前に行った削除からマージからの追加までの間に、変更をコミットしようとして、さらにツリーの競合が発生しました。私の作業コピー(現在はトランクバージョンのファイルが含まれている)を優先してsvnが競合を解決し、コミットしました。すべてが良いはずですよね?

うーん、ダメ。 branch2の別のコピーを更新すると、古いバージョンのファイルが生成されました(トランク統合前)。だから今、私はブランチ2の2つの異なる作業コピーを持っていると思われ、おそらく同じバージョンに更新され、2つの異なるバージョンのファイルで、両方とも完全に最新であると主張しています! branch2のクリーンコピーをチェックアウトすると、ファイルの古い(トランク前)バージョンが作成されました。これらを手動でトランクバージョンに更新して変更をコミットし、最初の作業コピー(最初にトランクの変更を送信した元のコピー)に戻り、更新を試みて、問題のファイルでチェックサムエラーを取得します。問題のディレクトリを吹き飛ばし、アップデートで新しいバージョンを入手してください。最終的に、trunkが変更されたbranch2の良いバージョンになるはずです。私は願います。警告の開発者。

1
dewtell