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


95

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

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

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

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

回答:


40

「ツリーコンフリクト」設計ドキュメントの旧バージョン(2009)で述べられたように:

バージョン付きファイルの追加によるマージによるXFAIL競合

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

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

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

あなたはまだ元のブランチで作業している場合、理想的なシナリオは、元支店からそのファイルを削除するだろうB1から、マージバックをB2するB1上でそのファイルが見えるようにするためにB1(あなたの意志、同じ要素の作業)。
マージがからB1にのみ発生するためにマージバックが不可能な場合はB2、各B1->B2マージで手動マージが必要になります。


2
「ツリーコンフリクト」のデザインドキュメントはリンクが腐っています:(
whitey04

4
面白いことに、追加された両方のファイルが同一であっても、競合しているように見えます。これは実際には競合としてフラグを立てるべきではありません。
SantiBailors、2015

1
@SantiBailors面白いので今すぐ死にます。私の古い友人gitのために死にます...

163

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

svn resolve --accept working <YourPath>

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


2
おかげで、これも解決します:C foo.txt>ローカル追加、更新時の着信追加
lazysoundsystem

5
おかげで私にとってもうまくいきましたが、これを行わなければなりませんでした:svn resolve --accept working FILENAME
ajacian81

5
ええ、あなたはファイル名が必要です。「。」を受け入れます (現在のディレクトリ)。「svn resolve --accept working --recursive」と再帰的に実行する必要もありました。作業コピーを優先してすべてを解決します(危険です。競合を解決するときはいつものように、これを行うと他の人の変更を吹き飛ばしてしまう可能性があります)
Harry Wood

私はすべての木衝突したファイルのリストを作成したエイリアスを使用します alias mtc='stat | awk "BEGIN { FS=\" \" } /^.{6}C/ { print \$NF }"' :その後、私はこのように、resolveコマンドに引数としてこれを使用することができます svn resolve --accept working $(mtc)
アール・ジェンキンス

1
実際には、リソースも指定する必要があります。例: svn resolve --accept working path/index.html
Tomasz Kuter

9

受け取った変更が必要な変更である場合はどうなりますか?私はsvn resolveを実行することができません-彼らのフルを受け入れます

svn resolve-ベースを受け入れる


4
私はその質問を誤解したと思います。実際、「svn resolve」を使用する場合、「base」は「theirs-full」と同等ですが、問題は解決しません。代わりに、2つの部分に分割しました。1)ローカルの競合するディレクトリ(またはファイル)を削除します。2)マージします。これは競合することなく実行され、「受信した変更は必要な変更である」ため、削除されたアイテムは気にしません
Gabriel FT Gomes '23

2

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.