質問
cvs2svnを使用して、CVSプロジェクトをSubversionに変換します。メイントランク(HEAD)があり、トランクからいくつかの一時的な開発ブランチが作成されます。
変換する前に、トランクからの最新の変更をすべてのdevブランチにマージします。ただし、まだトランクにマージされていない変更もあります。
プロジェクトをSVNに変換すると、マージ履歴プロパティがなくなります。それでは、これらのプロパティをどのように初期化して、その後ブランチにマージしたりブランチからマージしたりできるのでしょうか?
つまり、変換後、トランクと特定のブランチの間には多くの違いがあります。次回トランクからブランチにマージするときに、マージする必要のある変更としてそれらの違いを見たくありません。しかし、ブランチからトランクにマージするときは、マージします。これは可能ですか?
更新:mhaggerの提案を受け、ブランチにはトランクからすべての変更が既にマージされていることをSVNに伝えました:
svn co [branch URL] .
svn merge --record-only [trunk URL]
svn commit -m ''
これは機能するので、次回トランクからブランチにマージしようとすると、新しい変更は表示されません。
しかし、ブランチからトランクに戻るマージの再統合にはまだ問題があります。最終的に、多くの「R」で置き換えられたファイルが表示されます。つまり、トランクにはファイルXがあり、ブランチにはファイルXがありますが、同じファイルとは見なされません。これにより、適切な結果が得られるように見えますが、マージの種類が面倒になります。
これは次の一連のイベントが原因で発生すると思います:
- ブランチが作成されました(CVSで)
- ファイルXがトランクに追加されました(CVSで)
- Xはブランチにもマージされました(CVSでも)
- プロジェクトはSubversionに変換されました
- Subversionはbranch / Xがtrunk / Xからコピーされたことを知りませんでした。それはそう 代替品だと思います。
SVNの履歴は次のようになります。
r100: create branch (copied from trunk)
r200: add trunk/X
r300: add branch/X (because of a CVS merge, but it's not a SVN copy)
つまり、Subversionにファイルを無視するように指示する方法はありますか」 --reintegrate mergeを実行するときの祖先?または、これらのファイルを変換するより良い方法は?
解決 2
OK、上記の--reintegrateの問題の回避策があると思います。誰かが興味を持っている場合に備えて。
この文書によると、トランクの最新バージョンをブランチにマージしました。--reintegrateを実行することは、これをトランクに実行することと本質的に同じです。
svn merge [trunk URL] [branch URL]
ただし、この構文では--ignore-ancestryが許可されますが、-reintegrateでは許可されません。だから私はできる:
svn merge --ignore-ancestry [trunk URL] [branch URL]
これは、すべての「R」置換ファイルなしで、--reintegrateと同じ結果を示しています。他の唯一の違いはmergeinfoプロパティのようです。これらが正しいかどうかわからないので、-reintegrateの後と同じように、後でブランチを削除することをお勧めします。
他のヒント
ご存知のように、cvs2svnは、分岐の出所に関する暗黙の情報を除き、マージメタデータを生成しません。 (CVSはそのような情報を記録しないため、できません。)したがって、変換後、CVSで行われたマージについてSubversionに明示的に通知する必要があります。
これを行う最も簡単な方法は、" svn merge --record-only ...
"を使用することです( Subversionブック。