5

trunkブランチが 1 つと 1 つあると仮定します( COKE)。(私は SVN で Git を実行し、Git ではなく svnとマージしtrunkます)COKE

  1. ブランチFILE1 on trunkに必要な変更がありました。COKE
  2. 私たちは からマージしtrunk、私は でマージをコミットしCOKE branchます。
  3. その後FILE1から削除されtrunk、 でその変更が必要ですCOKE
  4. でマージすると、 でツリーの競合が発生しFILE1ますCOKE branch

このツリー競合は(2)のマージでコミットが原因で発生するのでしょうか?

この 3 つの競合を解決するにはどうすればよいでしょうか?

svn resolve --accept theirs-full /path/FILE1うまくいかない、「働く」だけがうまくいくと言います。

4

2 に答える 2

3

特定のマージ追跡情報が欠落していない限り、このシナリオではツリーの競合は発生しないはずです。

これを確認するには、次のコマンドを実行します。

$ svn switch ^/branches/COKE
$ svn mergeinfo --show-revs=merged ^/trunk

これにより、トランクからCOKEブランチにマージされたリビジョンのリストが出力されます。トランクでFILE1を変更したときに、リビジョンを見つけることができますか?おそらくその改訂はありません。

これは、SVNユーザーが1つのブランチから別のブランチに変更をマージするが、マージによって変更されたファイルだけでなく、作業コピー全体(つまりルートディレクトリを含む)をコミットする場合の一般的なケースです。

間違い:

$ svn merge ^/trunk
--- Merging r5 through r6 into '.':
M    file.txt
--- Recording mergeinfo for merge of r5 through r6 into '.':
 U   .
$ svn commit FILE1

問題は、ルートディレクトリにsvn:mergeinfoプロパティが格納されていることです。Subversionはこのプロパティを使用してマージを追跡するため、作業コピー全体をコミットする必要があります。

右:

$ svn merge ^/trunk
--- Merging r5 through r6 into '.':
M    file.txt
--- Recording mergeinfo for merge of r5 through r6 into '.':
 U   .
$ svn commit .

トランクを2回目にCOKEブランチにマージしようとしたときに、Subversionは、FILE1がトランクで削除され、同時にCOKEブランチで変更されたことを検出しました(ステップ2による)。その結果、ファイルにツリーの競合(ローカル編集、マージ時の着信削除)のマークが付けられました。

それを修正する方法は?

次に、ブランチCOKEのマージ追跡情報を修正する必要があります。これを行うには、-record-onlyオプションを指定し、適切なリビジョンを指定して、手順2を繰り返します。

$ svn merge --record-only -cN ^/trunk
--- Recording mergeinfo for merge of r5 through r6 into '.':
 U   .
$ svn commit .

ここで、Nは、マージしようとしたトランク内のFILE1の変更です。

于 2012-10-16T16:44:13.113 に答える
1

vadishev の回答により、このスクリプトを作成するための知識が得られました。これにより、欠落している mergeinfo が自動的に追加されます。

pwd がブランチ ルートであることを確認してから、次を実行します。

trun="path/to/trunk/root"
for i in `svn mergeinfo --show-revs=merged $trun | sed 's/^r//g'`
do 
  echo "working on $i"
  svn merge --record-only -c$i $trun
done

または、ワンライナーとして:

trun="../../trunk/tetracosm"; for i in `svn mergeinfo --show-revs=merged $trun | sed 's/^r//g'`; do echo "working on $i"; svn merge --record-only -c$i $trun; done
于 2015-08-12T00:16:08.513 に答える