2009-10-20 13 views
20

私はソフトウェアプロジェクトを引き継ぎ、すべてをTortoise SVNを使ってSVN(Assemblaにある)の下に置くことに決めました。トランクはROOTの下にあります。したがって、トランクにはアプリケーション全体が含まれていました(これには1.0というタグが付いています)。私の最初の大きな特徴として、 "dev"という名前の機能ブランチを作成しました。SVNブランチ/ツリーの競合を '修正する'方法は?

トランクブランチの変更をdevブランチに問題なくマージできました(私は小さなバグ修正を行っていたため)。私の機能が完了したら、私はトランクブランチにマージしました。この時点まではすべてが機能していました。 ROOTの下の新しいコードは、新しい機能を適切に示しました。しかし、私は(マージの結果の)コミットし、今は私がルートまたはdevブランチからマージしようとするたびに、SVNは、多くのファイルで "ツリーの競合"について苦情を言います。私がマージしてから触れなかったファイルさえも。私は紛争を解決しようとしましたが、成功しませんでした。

私は唯一の開発者だから、リポジトリの大きな変更は本当に気にしません。しかし、可能ならば、すべてのファイルの履歴を保持したいと思っています。

この問題を解決するにはどうすればよいでしょうか? ROOTトランクのすべての最新ファイルにファイルの「明確な」バージョンとしてタグを付ける方法はありますか?


[EDIT]の詳しい情報

  1. はい、 'メイン' と 'トランク' は同じものです。私は私の質問を明確にしました
  2. フィーチャーブランチからマージしたときに、最初にトランクから別のマージを行い、最新のトランクの変更を取り止めましたか "はい、トランクは最新のものでした。
  3. "コミット時にすべてがうんざりだ":コミットがうまくいっていたのですが、トランクからトランクにマージするとすぐに、SVNは "ツリーの競合。私は200以上の木の競合を持って
  4. 。私が探しているだから何でコマンド 『すべてを受け入れる』

[編集] elhoimの解決策は私の問題を解決しませんでした。しかし、彼はSVNのバージョンの問題で正しかった。現在(2009-10-28)、AssemblaはSVN v1.5.1を使用しており、tortoiseSVNはv1.6です。だから私は木の葛藤が大変だったのです。 elhoimのリンクで提供されているソリューションを試してみましたが、うまくいきませんでした(HEAD-to-HEADマージを試す前に複数回マージを試みましたが、いくつかのファイルはルートブランチに引き継がれませんでした)。

HEADからHEADへのマージがまだうまくいかないことを見て、ブランチフォルダ内のすべての ".svn"ファイルを削除し、ファイルをROOTフォルダにコピーしてコミットすることにしました。

+0

@eldimo: 'dev'に 'main'をマージしたとき、 'main'ブランチはトランクと同じですか?または、トランクがまだ見ていなかった「メイン」に座っている変化がありましたか? – dls

+1

@dls:私は彼が同じ支店を意味するために "main"と "trunk"という用語を使うと思う。 –

+0

@eldimo:より分かりやすくするためにいくつかの詳細が必要です。1.機能ブランチから元に戻ったときに、最初にトランクから別のマージを行い、最新のトランクの変更を取り止めましたか? 2.コミット時に「すべてがうまくいった」という意味はどうですか?コミット中に受け取ったエラーメッセージを供給することは可能ですか? –

答えて

6

トランク上のディレクトリ構造のレベルで行われたいくつかの変更が、トランクにマージバックを試みる前にdevブランチに吸収されていないようです。これは、あなたのケースでの木の衝突を引き起こした可能性があります。

私はSVN本のこのセクションが非常に役に立ち、あなたのような状況を解決する方法が含まれています。お役に立てれば。 http://svnbook.red-bean.com/nightly/en/svn.tour.treeconflicts.html

[EDIT] ADDITIONAL INFO:


では、すでにSVNはあなたが実際に上書き/競合のバージョンを解決し、ワークスペース上を解決し実行したことがありますか? 問題のあるワークスペース(実​​際にマージを行った場所)に「競合」とマークされているファイルやフォルダがある可能性があります - 一度それらを調べて手で解決したら、svn "解決済み"を実行できます。私は、私のマージのためにSubversionコマンドラインクライアントを使用しています - しかし、私は確認しており、このオプションは亀にも利用可能です。これにより、紛争状況を打ち消し、進めることができます。がんばろう。

5

一般に、SVNのマージサポートは、機能ブランチを1度だけ使用して、を処理することができます。つまり、トランクからトランクへの変更をマージしてから、svn merge --reintegrateを使用して、完了したらトランクにマージします。

その後、作業を​​続けたい場合は、作業する新しいブランチを作成する必要があります。私はあなたが同じリポジトリのパスを保持したい場合は、古いものを削除し、その場所に新しいものを作ることができると思うが、svn:mergeの情報が狂った場合に備えてテストレポを最初に試してみてください。

これは完全ではありません。より詳しい情報については、現在のマージセマンティクスが導入された時点のthis postを参照してください。あなたがこれを行う場合、あなたは(必要であれば、ブランチとトランクの両方で)自分が作成スプリアスsvn:mergeプロパティを削除する必要があります -

また、支店以外の目的のためにsvn cpまたはsvn mvのいずれかの使用には注意してくださいとマージ再統合を実行する前に、失敗すると競合メッセージが表示されます。

全体として、svnのブランチとマージは分散VCSファミリ(git、hg、bzr、darcsなど)に比べてかなり弱いですが、これらのガイドラインに従えば、それは仕事をします。

+1

私たちは1.7以降、この問題を抱えていました。SVN redbookのライブ文書の脚注には、1.5と1.6のこの「ヒット/ミス」機能が時々明らかになり、修正されています。したがって、機能ブランチ(またはCIリリースブランチ、ここではCIリリースブランチ)をツリーのコンフリクトを使ってトランクにマージした後の唯一の真の解決策と思われます。元のブランチを吹き飛ばして新しいブランチを作成するのが最善の方法です。 ..しかし、待って、それはCIのために動作しません!何をすべきか?! –

関連する問題