SVNだけでそれを達成する方法はないと思います。必要なのは、GitやMercurialのようなある種の分散型バージョン管理システムです。
どちらか一方を使用したことがあるかどうかはわかりませんが、両方を使用して目的を達成することはできます。
これが私のアイデアへのいくつかのステップです(Mercurialの観点からですが、これはGitとまったく同じです):
- Mercurialリポジトリを初期化します(
hg init
空のディレクトリにあります)
- svnリポジトリをチェックアウトする
- すべてのファイルをMercurialリポジトリに追加します(
hg addremove
)
- Mercurialリポジトリに変更をコミットします(
hg commit -m "initial commit"
)
- Mercurialリポジトリを別の場所(
hg clone /path/to/myrepo .
空のディレクトリ)に複製します
これで、このMercurialクローンで作業し、コミットすることができます。ただし、元のMercurialリポジトリに変更をプッシュしないことが非常に重要です。
SVNリポジトリを更新するには、次の手順に従います。
- SVNチェックアウト:
svn update
- まだSVNチェックオントにあります
hg addremove; hg commit -m "svn update"
- workindディレクトリ(mercurialクローン):
hg pull; hg merge; hg commit -m "merging svn update"
これが機能するには、作業ディレクトリがクリーンである必要があります。つまり、すべての変更がコミットされている必要があります。
基本的に、私たちが行っているのは、SVNリポジトリへのある種のプロキシとしてMercurialを使用することです。元のソースを変更せずにローカルのMercurialクローンにコミットし、SVNから更新してから、これらの変更をローカルのMercurialクローンにマージできます。
これらの手順をGitで再現する方法は正確にはわかりませんが、それも可能です。それらの1つを知っていれば、他のdvcでも可能です。
私はこの解決策が少し複雑であることに完全に同意しますが、これを達成するためのより簡単な方法を見つけることはできませんでした。私はCVSリポジトリをソースとして9か月間このように作業しましたが、問題は発生しませんでした。
ただし、dvcs、git、またはmercurialについて聞いたことがない場合は、これらの手順が非常に複雑で、問題がすぐに発生する可能性があるため、ドキュメントを読むことを強くお勧めします。
この助けを願っています。
編集:
SVN外部を使用することもできますが、リポジトリにインポートする変更を確認して選択することはできません。
次のディレクトリにsvn:externalsプロパティを設定する必要があります。
svn propedit externals adirectory
adirectory
これにより、ディレクトリの外観を編集できるエディタが開きます。ここで、このディレクトリにチェックアウトする外部リポジトリごとに次のような行を追加します(行ごとに):
path/where/tocheckout http://svn.example.com/repos/project
次回更新を行うとき、svnリポジトリは指定されたディレクトリで完全な履歴とともにチェックアウトされます。
(svn:externalsを使用してから長い時間が経ちます。説明の一部が間違っている可能性がありますが、全体像を把握するにはおそらく十分でしょう)