-1

「svn merge」を使用してトランクの変更をブランチに同期しようとしましたが、Subversion はすべてのファイルに競合があると言います。これらのファイルのほとんどは、トランクでもブランチでも変更されていません。ディレクトリ構造も変更していません。私は何を間違っていますか?

より詳細には、私は自分のコンピューターの /Users/steve/myproject/nsvbranch にあるブランチにいます。「svn merge https://myserver.org/users/steve/myproject/trunk」と入力します。これは、nsvbranch と同じディレクトリのトランク バージョンです。「ls」は、2 つのケースで同じファイルを返します。サーバーは少し時間がかかり、その横に「C」が付いたすべてのファイルを完全に一覧表示します。すべてではありませんが、それらのいくつかについては、競合にどのように対処したいかを尋ねられます。競合に対処する方法について尋ねられたいくつかのファイルを含め、ほぼすべてのファイルで、ブランチが作成されてからトランクまたはブランチに変更が加えられていません。

私は明らかに非常に単純な初心者のエラーを犯していますが、それが何であるかを理解できないようです. 助けてくれてありがとう!

-スティーブ

4

3 に答える 3

0

バージョン 1.4 はもう使用しないでください。Subversion 1.5 に大きな変更があり、Subversion にマージ追跡が追加されました。実際、バージョン 1.4 で変更されたコードをコミットできないようにするために、システムにプリコミット トリガーを設定している人が誰もいないことに驚いています。

Subversion 1.4 を使用しているため、他の問題が発生している可能性があります。たとえば、何がマージされ、何がマージされなかったのかわかりません。1.5 より前の Subversion では、マージするすべてのリビジョンを指定する必要があります。手動で。プロパティを探して、svn:mergeinfo何がマージされたかを確認する最善の方法は次のとおりです。

$ svn propget -R svn:mergeinfo .

これにより、すべてのマージとマージされたリビジョンが出力されます。これを使用して、マージする必要があるリビジョンを把握できます。たとえば、リビジョン 2300 を使用していることがわかり、svn:mergeinfo がリビジョン 1230-2298 がそのブランチから既にマージされていることを示している場合、リビジョン 2299 を 2300 にマージすることを指定する必要があります。

$ svn merge -r2299:2300 $REPO/$branch/$project

それを行ったらsvn:mergeinfo、最新のマージで更新する必要があります。

$ svn pe svn:mergeinfo .  #And all files/directories where this is set

もう 1 つの可能性は、誰かがブランチ/トランクを削除して再作成したことです。誰かがこれをしたと想像してください:

$ svn co $REPO/trunk/foo
A foo/bar.txt
A foo/foo.txt
$ cd foo
$ svn delete bar.txt
$ svn commit -m"Deleted bar.txt"
$ svn up
$ vi bar.txt
$ svn add bar.txt
$ svn commit -m"Added bar.txt back in"

あなたの単なる人間の目に$REPO/trunk/foo/bar.txtは、両方のリビジョンで同じだと思います. 結局、どちらも URL を持っています$REPO/trunk/foo/bar.txt。Subversion にとって、これら 2 つbar.txtは 2 つの完全に異なるファイルであり、共通点はありません。誰かが に変更を加え$REPO/branches/1.2/foo/bar.txt、この変更をマージしようとすると、マージの競合が発生します。実際、マージの競合は、ローカルの追加が更新の邪魔になっていることを示しています。

トランクがブランチと一致する必要があると判断する場所をたくさん見てきました。彼らはトランクを削除し、ブランチからファイルをコピーしました。実際、私はこれを見ました:

$ svn delete -m"Who needs trunk?" $REPO/trunk  #Delete trunk
$ svn add -m"Making a real mess of things" $REPO/trunk #Add a new trunk
$ svn co $REPO/trunk  # Check out the now empty trunk
$ cd trunk
$ cp -R $work/branches/1.4 .  #Copy a branch 1.4 working directory to trunk
$ svn add .  #Now add all of those files back in
$ svn commit -m"A trunk with files that aren't related to anything!"

この場合、開発者はトランクを削除しただけでなく、単に新しい空のトランクを作成し、ファイルを Subversion の背後にコピーしてから、再度追加しました。トランク内のすべてのファイルは、リポジトリ内のどのファイルとも完全に無関係です。似たような URL を共有していますが。この場合、ブランチからトランクにマージできなかった理由も知りたいと考えていました。結局のところ、それはファイルがどこから来たのですか?

これが行われた場合、基本的に推進手段のないかなり腐敗した河口を上っていることになります.

私が追加できる唯一の提案は、試してみることsvn merge --ignore-ancestoryです。また、パラメーターを試して、--dry-run何にも影響を与えずにマージがどのように行われるかを確認することをお勧めします。

于 2013-05-27T19:53:23.300 に答える
0

助けてくれてありがとう。サーバーのサブバージョンを現在のバージョンに更新できないため、リビジョン番号を入力しました。この方法でのマージは非常に簡単であることがわかりました。ログを振り返ってブランチが作成された場所を見つけ、「merge -r2050:2121 https://myserver.org/users/steve/myproject/trunk」と入力しました。その後、それは当然のことでした。

-スティーブ

于 2013-05-29T21:25:44.080 に答える