Subversion の Mercurial:移動、名前変更、タグ付け
-
19-09-2019 - |
質問
次のレイアウトの Subversion リポジトリがあります。
svnrepo/projectA/trunk
svnrepo/projectA/tags
svnrepo/projectA/branches
svnrepo/projectB/trunk
svnrepo/projectB/tags
svnrepo/projectB/branches
これを、レイアウトを変更して mercurial リポジトリに移動したいと思います。
hgrepo/プロジェクトA
hgrepo/プロジェクトB
これを行うための最良の方法は何ですか?私の考えの一部は次のとおりです。
オプション1
Subversion のパスを (svn move を使用して) 中間形式に再配置します。
svnrepo/trunk/projectA
svnrepo/trunk/projectB
svnrepo/tags/projectA
svnrepo/tags/projectB
svnrepo/branches/projectA
svnrepo/branches/projectB
次に、svnrepo/trunk で hg Convert を実行します。これにより hg のインポートが混乱しますか?
オプション 2hg は、各プロジェクト/トランクを個別の hg リポジトリに変換します。次に、それらを単一の hg リポジトリにマージします (hg init、hg pull -f projectA などを使用)。これにより、最初にインポートされたプロジェクトのブランチ名とタグが失われると思います。
解決
Mercurial では、関連のないコードベースを同じリポジトリに保存することは悪い考えです。
- マージが大幅に複雑になります。マージは行われた変更に応じて異なります 全て マージしようとしているプロジェクトだけではなく、プロジェクトを含めます。
- ストレージとチェックアウトのオーバーヘッドが原因 -- 私の知る限り、Mercurial はリポジトリのサブディレクトリのみのチェックアウトをサポートしていません。すべてのプロジェクトを一度に分岐する必要があります。
解決策は、単一の Subversion リポジトリを複数の Mercurial リポジトリに変換することです。ほとんどの変換ツールはこれをサポートしています。
他のヒント
各プロジェクトは独自の Hg リポジトリに存在する必要があります (特定のプロジェクトのみを取得またはタグ付けできるようにするため)。
Subversion に表示されるディレクトリ (トランク、タグ、ブランチ) は、ブランチとタグが第一級市民である最新の (D)VCS には存在しないことに注意してください。メタデータはツールによって直接管理されます)。 安いコピー (SVN 内)。
つまり、SVN リポジトリを変換するときは、Hg リポジトリの履歴に「トランク」、「タグ」、または「ブランチ」ディレクトリを直接保存しないでください。
むしろ、 ようなツール hgsubversion
SVN リポジトリ (単に「repo/projectA」など) を projectA 専用の Hg リポジトリにインポートします。元の SVN プロジェクトのタグとブランチを保持し、それらを Hg オブジェクトに変換します。
から そのドキュメント:
を使用したすべてのアップデート
hgpullsvn
SVN URL の最後のコンポーネントから名付けられたブランチ内で作成されます (たとえば、SVN URL が次の場合)svn://server/myproj/branches/feature-ZZZ
,hgpullsvn
名前付きブランチを作成して使用します 'feature-ZZZ
')
「変換」ではなく「同期」したい場合は、 トンファー 推薦する hgsubversion
, ただし、「大規模なリファクタリングのため、現在は流動的な状態にあります」。
今のところそうです ない 実稼働環境で使用する準備ができています。これをハッキングして、Mercurial や Subversion の内部に飛び込む準備ができている場合にのみ、これを使用してください。
以来 hgsvn
一部の同期も許可します hgpushsvn
そして hgpullsvn
...私はそれに固執します hgsvn
今のところ。