私はSVNリポジトリを持っています。そこには多くのディレクトリがあります。ここで、このリポジトリのクローンを作成し、特定のディレクトリを1つだけ残します。そしてもちろん、この新しいリポジトリ内の他のディレクトリに関連するリビジョンは必要ありません。どうすればいいですか?ありがとう。
3 に答える
リポジトリのダンプを作成し、必要なディレクトリとリビジョンを除外する必要があります。svndumpfilter
このための万能ツールです。例については、転覆の本のこの章を参照してください。
もう1つの可能性は、対象のディレクトリのみをプルするgitsvncloneです。その後、新しいsvnリポジトリにプッシュできます。簡単ですか?いいえ。ただし、サーバーにアクセスできない場合は便利です。より良い方法があると確信していますが、この方法により、誤って元のsvnリポジトリにプッシュしないようにできます。
#元のsvnパス git svn clone http:// server / path / to / clone orig #あなたのブランチだけを入れるSVN svnadmin create new #1つのエントリを追加するか、gitsvnエラーを出力します... svn co file:/// path / to / new new.wd mkdir new.wd / null svn add new.wd / null svn ci -m "add null" new.wd / null #クローンを作成する git clone file:/// path / to / orig abc cd abc #svnリポジトリへのsvnパスを設定します git svn init file:/// path / to / new #データをプルイン(1つのコミット) git svn fetch #ブランチを表示 gitブランチ-a #プッシュ用のgitレポを準備する git rebase --onto remotes / git-svn --root master #最後に新しいsvnリポジトリにプッシュします。 git svn dcommit
これを行う方法をどこで見つけることができなかったので、私はこれを思いついた。次のようにsvndonfファイルをいじる必要があるかもしれません。
svn_repo = "$(pwd)/ new" user = "myusername" エコー'[/]'>> $ svn_repo / conf / authz echo "$ user = rw" >> $ svn_repo / conf / authz echo'[users]' >> $ svn_repo / conf / passwd echo "$ user = test" >> $ svn_repo / conf / passwd echo'password-db = passwd' >> $ svn_repo / conf / svnserve.conf echo "svn repo is file:// $ svn_repo" svn co file:// $ svn_repo svn.wd
上記の例では、myusernameのパスワードはtestです。
実行しようとしていることを実行する従来の方法は、リポジトリをダンプファイルにダンプし、svndumpfilterを使用して必要に応じてファイルを含めたり除外したりしてから、フィルタリングされたダンプファイルを新しいリポジトリにロードすることです。このアプローチは、リポジトリからいくつかのファイルを削除するなどの単純な変更に適しています。
リポジトリにファイルの移動とコピーが含まれていると、状況は少し難しくなります。
MyProject
履歴内の過去のある時点でに名前が変更されたというプロジェクトフォルダを持つ最も簡単な例を見てみましょうTheProject
。呼び出された別のファイルは、その後、場所からTheProject/copiedfile.txt
コピーされました。初歩的なツリー構造は次のようになります。TheProject
AnotherLocation
...
+ AnotherLocation
|--- copiedfile.txt
|--- unwantedfile.txt
+ TheProject
|--- copiedfile.txt
|--- otherfile.txt
...
TheProject
独自の新しいリポジトリが必要です。したがって、リポジトリをファイルにダンプし、svndumpfilterを使用して含めるだけにしますTheProject
。これは、HEADリビジョンに表示されるプロジェクトの名前だからです。
svndumpfilter include /TheProject < input.dump > output.dump
残念ながら、svndumpfilterからこのエラーが発生します
svndumpfilter: E200003: Invalid copy source path '/MyProject'
TheProject
これは、以前は呼び出されていたためMyProject
、過去のあるリビジョンで名前が変更されたためです。名前の変更は基本的に削除とコピーであるため、svndumpfilterは、作成TheProject
して正しく表示されるコピーのソースを見つけることができず、エラーが発生します。したがって、次のコマンドを使用して再試行しMyProject
ます。
svndumpfilter include /TheProject /MyProject < input.dump > output.dump
Svndumfilterで別のエラーが発生するようになりました。
svndumpfilter: E200003: Invalid copy source path '/AnotherLocation/copiedfile.txt'
はい、これはからcopiedfile.txt
にコピーされたAnotherLocation
ためTheProject
です。したがって、このファイルもインクルードする必要があります。そうしないと、「TheProject」にコピーできなかった可能性があります。もう一度やり直してみましょう。
svndumpfilter include /TheProject /MyProject /AnotherLocation/copiedfile.txt < input.dump > output.dump
操作は成功します!3回目はラッキーそうです!
フィルタリングされたダンプファイルをリポジトリにロードしてみましょう。
svnadmin create newrepo
svnadmin load newrepo < output.dump
結局、それほど幸運ではありません!ロード中に次のエラーが発生します
* editing path : AnotherLocation/copiedfile.txt ...svnadmin: E160013: File not found: transaction '1-1', path '/AnotherLocation/copiedfile.txt'
ああ!AnotherLocation
これは、の親フォルダであるため、必要なものを含めるのを忘れたためです。copiedfile.txt
svndumpfilter include /TheProject /MyProject /AnotherLocation < input.dump > output.dump
このコマンドは機能し、読み込みも機能します。残念ながら、現在も含ま/AnotherLocation/unwantedfile.txt
れています。svndumpfilter include
これは、使用しても実際には機能しないと結論付けています。これは、目的の粒度が得られないためです。必要のないものをすべて除外するために、を使用svndumpfilter exclude
してすべてを実行する必要があります。そのため、必要なファイルを含むリポジトリが作成されます。それはそれ自身の一連の問題に満ちていると言えば十分です。たとえば、リポジトリで実際に必要なファイルを除外するのは非常に簡単です。人々がこれの例を望むなら、私はこの答えを拡張することができます。
より良い方法があるに違いありません。あることが判明しましたが、それは商用製品です。Subversionリポジトリからファイルとフォルダを抽出することに特化したSubdivisionというツールを開発しました。また、Subversionリポジトリからファイルを削除(または消去)したり、リポジトリを2つの部分に分割したりしながら、2つのリポジトリのいずれかからファイルが失われないようにすることもできます。Subdivisionを際立たせるのは、リポジトリ全体のメモリ内ビューを保持し、上記の例で発生したすべての問題を解決するために必要なアルゴリズムを実行するという事実です。これは、操作が1回のパスで完了するため、ユーザーの時間を節約しながら、適切なファイルを抽出するために必要な粒度が得られることを意味します。