1つのフォルダーを1つのSubversionリポジトリから別のリポジトリに移動するにはどうすればよいですか?


156

「project」という名前のSubversionリポジトリに「docs」フォルダがあります。「project_docs」という名前の別のSubversionリポジトリに実際に保存する必要があるという結論に達しました。

「docs」フォルダ(およびそのすべてのリビジョン)を「project_docs」リポジトリに移動したいと思います。これを行う方法はありますか?

回答:


183

(作業コピーではなく)リポジトリ自体にアクセスできる場合は、現在のリポジトリをダンプし、それをフィルタリングしてdocsフォルダーに関する情報のみを含め、他のリポジトリにロードすることができます。

このようなものになります:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

リポジトリにアクセスしないと、変更履歴を維持できず、ファイルを新しいリポジトリにコピーしてコミットすることで解決する必要があります。


1
いい例です。リンク先のドキュメントに記載されているように、このソリューションではすべてのリビジョンに番号が付け直されるため、「空」がないことに注意してください。他の場所でドキュメントのリビジョンを参照する場合に留意する必要があること。
アダムベレア

1
大量の空のリビジョンをターゲットリポジトリに追加しないように、空のリビジョンを削除することを提案しました。おそらく、ロードについて知らない人を混乱させる可能性があります。--preserve-revpropsは、デフォルトのロードを使用する代わりにコミットメッセージを保持するため。
サミュエル

11
答えてくれてありがとう。誰かが知っておく必要がある場合に備えて、複数のフォルダが必要な場合は、インクルードリストでそれらの間にスペースを入れてください。例 ... include folderOne folderTwo
Robin Robinson

6
コミットメッセージと問題追跡ツールがリビジョンを参照している可能性があるため、リビジョンの番号を付け直すのはおそらく悪い考えです
Wim Coenen

5
これでうまくいきました。私はWindowsユーザー(Visual SVNサーバー)であり、最初のコマンドは次のようになります(誰かを助ける場合)"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris

30

svndumpfilterには重大な欠陥があります。ファイルまたはパスが、フィルタリングしているパスからフィルタリングしているパスにコピーされた場合、svndumpfilterは履歴を記入できず、ジョブは失敗します。

この問題が発生した場合は、svndumpfilter2を使用できます。


4
これがsvndumpfilter2のより良いリンクです: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin

その場合は、必要なパスをリストに追加します...できるだけ具体的に...そして、インポート後にこれらのエントリをプロジェクトから削除します。
James Gawron、2013年

6

これについては、SVNのドキュメントで説明されています。...の[ Repository Maintenance]セクションを確認してくださいsvndumpfilter。特に、中央リポジトリからプロジェクトをダンプし、それらを新しい個別のリポジトリに移動する方法について説明します。


2

私はあなたがそれをリモートで(つまり、ローカルコピーなしで)できるとは思いません。しかし、これは機能するはずです。svn export元のサーバーからのフォルダー、次にsvn add新しいリポジトリーへ。

お気に入り:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

編集:D'oh、これは歴史を落とします。サミュエルが説明するsvnadminように使用します。


3
ただし、リポジトリ自体にアクセスせずにリビジョンを保持することはできません。作業コピーしか持てない場合、これは彼ができる最善の方法です。
サミュエル

2

今後の参考のために:

SVNドキュメントは明確に報告します:

最上位のディレクトリを削除するためにダンプファイルを手動で編集する予定の場合は、行末文字をネイティブ形式(たとえば、\ r \ nから\ n)に自動的に変換するようにエディターが設定されていないことを確認してください。コンテンツがメタデータに同意しないためです。これにより、ダンプファイルが役に立たなくなります。

sedまたはVimを使用して最上位ディレクトリを置き換えますが、このディレクトリ名はプロジェクトファイル内にも含まれていました !!!! これにより、SVNロードチェックサムエラーが発生します。

したがって、この操作を実行するときは、パス名のみのsedで文字列を置換しないでください。

「Node-path:old_path」を「Node-path:new_path」に置き換えます。詳細については、SVNブックの第5章「リポジトリ管理」を参照してください。


1

受け入れられた答えを使用しようとしましたが、巨大なリポジトリがあり、小さなディレクトリをエクスポートしたかったので、リポジトリ全体をダンプする余裕がありませんでした。

したがって、私は自分のディレクトリが変更されたリビジョンのみをエクスポートしました(エクスポートするディレクトリがリポジトリ内の他の場所への参照を持っている場合、これは機能しない可能性があります)。

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

リポジトリURL(URL_to_docs)、サーバー/svn/old_repo内の場所(path/to/docs)、リポジトリ内のドキュメントへのパス()を置き換える必要があります

docs_only.dump新しいリポジトリのdocディレクトリの場所を変更したい場合は、簡単に編集できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.