リポジトリ全体でsvn:externalsプロパティのすべてのURLを移行するにはどうすればよいですか?
-
03-07-2019 - |
質問
SVNリポジトリをあるマシンから別のマシンに移動中です。新しいリポジトリの新しいドメイン名が付属します。問題は、リポジトリ内に、リポジトリ内の他のプロジェクトへのsvn:externals参照がたくさんあるということです。たとえば、svn:externalsプロパティにあるprojectAがあります。
external/libraryA svn://oldserver.net/repo/libraryA
external/libraryB svn://oldserver.net/repo/libraryB
...など。すべてのURLはこの特定のドメイン名を参照するため、簡単に解析できます。すでにレッスンを学んだので、これらのURLを" svn:// localhost /"に移行しますが、リポジトリの履歴を調べ、古いURLをすべて書き換える方法を見つける必要があります。リンクが壊れることなく、これらのプロジェクトの古いリビジョンをチェックしてください。
これをどのように行うのですか?
解決
古いリビジョンをチェックアウトしたいということを示したように、唯一の解決策は実際に「書き換え」ることです。履歴全体(前述のソリューションD)。
これを行うには、次のことを行う必要があります。
1)全体リポジトリの内容をダンプしますtitle = "svnadmin dump"> svnadmin dump :
$ svnadmin dump /path/to/repos > original-dumpfile
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.
2)ダンプファイルを編集して、svn:externals URLを変更します。 これは最も難しい部分です:リポジトリにもバイナリデータが含まれていると仮定すると、プレーンテキストエディターでダンプファイルを開くと、ダンプファイルが破損する可能性が高くなります。いわゆる" hex-editor&quot ;、例えばフリーウェア16進エディタXVI32
3)新しいリポジトリを作成し、変更したダンプファイルをそこにロードします:
$ svnadmin create newrepos
$ svnadmin load newrepos < modified-dumpfile
詳細については、次のリンクもご覧ください。
http://svnbook.red-bean.com/en/1.1/ch05s03.html
注:Subversion 1.5では、実際にsvn:externalsプロパティに相対URL のサポートが追加されました。これにより、将来この種の問題を正確に防ぐことができます。
http://subversion.tigris.org/svn_1.5_releasenotes.html#externals
他のヒント
このために SvnDumpTool を使用します。まさにあなたが探しているものがあります:
svndumptool transform-prop svn:externals "(\S*) (|-r ?\d* ?)http://oldserver.net(/\S*)" "\2\3 \1" source.dumpfile source-fixed-externals.dumpfile
これにより、各外部が subversion 1.5形式に修正されます 、相対URLを使用します。
つまり、svn:externalsの例:
external/libraryA svn://oldserver.net/repo/libraryA
なる:
/repo/libraryA external/libraryA
サーバールートの相対URLを使用します。
9人のユーザーと4つの展開にわたって12の作業コピーを再配置する必要がありました。ドメインをIPに置き換えるという簡単な変更、つまり thing.domain.net-&gt; 192.168.0.1
説明どおりに動作するように svn relocate
を期待(ネストされた外部のトラバース)各場所で実行する簡単なDOS命令を作成しました:
for / D%G in(*)do(
cd ./%G
&amp; svn relocate http://thing.domain.net http://192.168.0.1
&amp; cd ..)
これは期待どおりに機能せず、親WCを再配置するだけでした。
私の解決策は、リポジトリ自体を編集して(Tortoise Repo Browserを使用)、外部の場所を変更することでした。この変更に続いて、再配置された親への更新のみが、すべてをラインに入れるために必要でした。
おそらく、すべてのTortoiseユーザーにURL履歴をクリアさせ、古いURLを使用して操作を誤って実行しないようにすることをお勧めします(DNSルックアップにまだ存在します):
設定-&gt;保存データ-&gt; URL履歴-&gt;クリア
viでダンプファイルを編集しましたが、「-b」を使用する必要がありました。行末と解釈される可能性のある文字が変換されないように、バイナリモードで編集に切り替えます。
e.g。 vi -b filename.dump
また、URLの長さが変更された場合、文字列の長さも変更する必要があることがわかりました。 たとえば、次のようなエントリを考えます。
ノードパス:trunk / src / include
ノードの種類:dir
ノードアクション:変更
prop-content-length:192
コンテンツの長さ:192
K13
svn:externals
V 156
MGL_ABC svn:// server_name / dir1 / dir2
MGL_DEF svn:// server_name / dir1 / dir3
これらのURLを変更するときに、文字列の長さが変更された場合、&quot; 192&quot;、&quot; 192&quot;も変更する必要があります。および「156」新しい長さに合わせます。
絶対長を計算するのは難しいが、差分を見つけるのは簡単だとわかった。
たとえば、URL 1が3文字短くなり、URL 2が4文字短くなったとします。次に、これら3つの文字列の長さの数値のそれぞれから「7」をサブラクトする必要があります。
次のことができます:
a)古いリビジョンをチェックアウトし、hostsファイルを変更して古い名前が新しいアドレスを指すようにしてから、svn update。 URLパスも変更された場合...そうしたら、あなたもそうするかもしれません:
b)現在の(古いリビジョンの)作業コピーでプロパティを検索し、コミットせずにそこでURLを変更するスクリプトを書くのに時間をかけます。または:
c)新しいプロパティ値をチェックインしたリビジョン(-s)をメモし、古いバージョンをチェックアウトし、それらのリビジョン(プロパティにのみ影響する)を作業コピーにマージします。
d)または、おそらくsvndumpを使用してリポジトリデータをダンプし、ダンプ内のURLを文字列置換してから復元します。
すべてのエクスターナルは、 flow
という名前のディレクトリにありました。このワンライナー(bashシェル)を使用して、外部のURLを修正しました。
for p in $(find -maxdepth 4 -name flow); do svn ps svn:externals "$(svn pg svn:externals $p/.. | perl -pe 's/^(\w+) svn\+ssh.*thing\.domain\.net(.*)/$2 $1/')" $p/..; done