質問
私はSVNが初めてなので、これは簡単な質問かもしれません。
「トランク」があります第1レベルのディレクトリ:
10 <-- documents
20 <-- source code, db scripts, ...
30 <-- documents
40 <-- referenced 3rd party library-es
「開発」を行いました; 「トランク」からの分岐。 「開発」でソースコードを変更し、テスト後に「トランク」にマージします。
ディレクトリ内の問題&quot; 10&quot;および「30」開発に不要な* .docファイルが保存されているため、「開発」する必要があります。ブランチにはこれらのディレクトリがありません。
解決策はまだあるはずです:
- 「svn update」を許可&quot; develop&quot;のルートフォルダー作業コピー、(20および40)
- その更新は再作成すべきではない ディレクトリ10および30および
- もちろん「開発」をマージします; 「トランク」へ&quot; trunk&quot;の10または30は削除しないでください。
編集: 「ソースコード」ということを忘れていました。は20だけではありません。参照されたdll-sやビルドスクリプトなどがあり、これらも1レベルのディレクトリにあります。たとえば40です。
解決
質問を正しく読んだ場合、これはsvn copyを使用して目的のディレクトリのみをブランチにコピーするという単純な問題です。基本的には、 Mike Kushner との回答の組み合わせです。 Ivan Krechetov 。ただし、自分で手順を実行すると理解しやすくなる可能性があるため、この投稿の残りの部分ではサンプルリポジトリを作成し、コピーとマージを表示します。
「標準」を使用していると仮定します。リポジトリレイアウト。トップレベルには、 trunk 、 branches 、および tags の3つのサブディレクトリがあります。また、 10 、 20 、 30 、および 40 の各ディレクトリはトランクの下にあります。言い換えれば:
trunk
10
20
30
40
branches
tags
そして、マイクが指摘したように、あなたの目標は次のような構造を持つことです:
trunk
10
20
30
40
branches
sandbox
20
40
tags
(少なくとも現在の編集時点では)投稿からはわかりませんが、 10 、 20 などのディレクトリ構造がある場合がありますトップレベル。この場合、新しいトップレベルディレクトリを作成する必要があります。これを dev と呼び、リポジトリ全体が次のようになるようにします。
10
20
30
40
dev
20
40
20 の下では dev を作成できないことに注意してください。まあ、物理的にはできますが、そうするとビルドを壊すことはほぼ保証されます。
OKですので、新しいリポジトリを作成し、その中にいくつかのファイルを配置する例を見ていきましょう。 svnadmin コマンドを実行できる必要があります(偏執的なシステム管理者がいない限り、実行できるはずです)。したがって、一時ディレクトリを選択し、次のコマンドを実行します(Linuxを実行しています。Windowsを実行している場合、コマンドは同じですが、REPO変数にWindows固有のパスを配置する必要があります):
svnadmin create temp.repo
REPO="file://`pwd`/temp.repo"
svn co $REPO temp
これにより、新しい(空の)リポジトリが作成され、その作業コピーがチェックアウトされます。 2行目には説明が必要です。現在のディレクトリからリポジトリURLを作成するだけです。ワークスペースディレクトリでは、URLは次のようになります。
file:///home/kgregory/Workspace/temp.repo
OK、作業コピーができたので、サンプルのディレクトリ構造といくつかのファイルを作成しましょう:
cd temp
svn mkdir trunk
svn mkdir branches
svn mkdir tags
svn commit -m "standard repo structure"
pushd trunk
svn mkdir 10
svn mkdir 20
svn mkdir 30
svn mkdir 40
svn commit -m "example sub-project structure"
echo "this doesn't change" > 10/dontchange.txt
svn add 10/dontchange.txt
echo "this does change" > 20/change.txt
svn add 20/change.txt
svn status
svn commit -m "example files"
popd
この時点で、サンプルディレクトリと2つのファイルが含まれています。 subversionの隠しディレクトリを除いた find の出力は次のとおりです。
temp, 531> find . | grep -v svn
.
./tags
./trunk
./trunk/10
./trunk/10/dontchange.txt
./trunk/30
./trunk/20
./trunk/20/change.txt
./trunk/40
./branches
次のステップでは、サンドボックスディレクトリを作成し、その中にある2つのディレクトリのコピーを作成します。
svn mkdir branches/sandbox
pushd branches/sandbox
svn copy ${REPO}/trunk/20 .
svn copy ${REPO}/trunk/40 .
svn commit -m "make development branch"
popd
これは重要な部分です。リポジトリからのコピーとして、作業ディレクトリにブランチとコピーを作成します。通常、 svn copy を2つのリポジトリ引数とともに使用して、 trunk
を branches
の子にコピーします。 trunk
の子が2つだけ必要なため、ここでは機能しません。
これを実行すると、作業コピーは次のようになります。
temp, 539> find . | grep -v svn
.
./tags
./trunk
./trunk/10
./trunk/10/dontchange.txt
./trunk/30
./trunk/20
./trunk/20/change.txt
./trunk/40
./branches
./branches/sandbox
./branches/sandbox/20
./branches/sandbox/20/change.txt
./branches/sandbox/40
この時点で、通常は開発ブランチを新しい作業ディレクトリにチェックアウトし、そこで作業します。それで、それを行います( cd をワークスペースディレクトリに戻した後):
svn co ${REPO}/branches/sandbox sandbox
cd sandbox
そして、いくつかの変更を行います:
vi 20/change.txt
svn commit -m "changed on branch"
OK、今度はトランクにマージします。ワークスペースに戻って、トランクだけをチェックアウトしてください:
svn co ${REPO}/trunk trunk
cd trunk
そしてサンドボックスからマージします。マージプロセスについては、で説明されています。 Subversionドキュメント:
svn merge -r 4:5 ${REPO}/branches/sandbox
svn status
最後のコマンドは、ファイル 20 / change.txt
のみがマージの影響を受けたことを示しているはずです。 10個または30個のディレクトリをブランチにコピーしなかったため、それらはマージの影響を受けません。
他のヒント
やりたいことは、「20」のコピーを作成することです。 svnツリーのどこかで、前後にマージできます。一般的な構造は
repo
---> trunk
---> 10
---> 20
---> 30
---> branches
---> sandboxes
---> develop <branch of 20>
---> tags
&quot; develop&quot;を更新する場合は、&quot; 20&quot;の新しいブランチを作成します。サンドボックスの下で、または20からマージを実行して開発します。 &quot; develop&quot;の変更が必要な場合トランクに戻り、別の方法でマージします。開発者は、「開発」のコピーをチェックアウトする必要があります。 (または&quot; develop&quot;に基づいて独自のブランチを作成します)
あなたが現在持っているリポジトリ構造ではできません。
リポジトリを再構築することをお勧めします。10&amp; 20、40&amp;他のコード関連アセットは、新しい第1レベルのフォルダーの下に移動されます。これにより、この状況を回避し、コード関連のアセットのみを取得できるようになります。
理想的には、より低いレベルで分岐する必要があります。つまり、トランクではなくブランチ20です。そうすれば、分岐する必要があるコンテンツのみを分岐することになります。つまり、分岐させたいということです。
作業コピーのソースコードサブディレクトリのみがそのブランチを指すようにすることで、それを実現できます。
svn cp http://example.com/svnrepo/trunk/source_code http://example.com/svnrepo/branches/development/source_code
cd ./source_code
svn sw http://example.com/svnrepo/branches/development/source_code
変更を行い、コミットします。次に、トランクにマージしましょう:
svn sw http://example.com/svnrepo/trunk/source_code
cd ..
svn merge -r [start_rev]:HEAD http://example.com/svnrepo/branches/development/source_code ./source_code
すべてが正常であることを確認するためのレビュー:
svn diff | less
そしてコミットします。 完了。
次のようにします:
-repo: Assemblies
--SomeAssembly
---Current
---v1.0
---v1.1
-repo: Source
--trunk
---Code
---Assemblies (external from Assemblies repo)
--branches
---v1.0
----Code
----Assemblies (external from Assemblies repo)
--Documents
この例では、サードパーティのアセンブリに独自のリポジトリがあります。この方法では、各ブランチとトランクで異なるバージョンを維持していません。補足として、アセンブリの最新バージョンは「現在」に複製されます。各アセンブリのフォルダー。これにより、すべてのプロジェクトの参照を更新することなく、アセンブリを更新できます。これはドメインの問題ではないかもしれませんが、私たちにとっては大きな痛みでした。
また、ドキュメントは階層内でトランクおよびブランチと同じレベルにあることに注意してください。このようにして、これらのファイルは複製されません。これがオプションでない場合は、それらを外部化することもできます。これにより、個別にソースを制御することなく、トランクとブランチに存在させることができます。
docs dirの制限事項に沿ってプロジェクトを構成する方法は、すぐに使用できるSVNのモデルには適合しません。
いくつかのアイデア:
- ドキュメントディレクトリをトランクの外に移動し、
svn:external
として追加します
- ドキュメントディレクトリをトランクの外に移動し、ビルドスクリプトでトランクとドキュメントディレクトリを組み合わせます
- (直接の
svn merge
ではなく)スクリプトを使用してマージし、スクリプトにルールを適用させます
コメントから:
10および30のドキュメントの変更を禁止します。これらは、トランク内でのみ変更する必要があります。
svn:externals の使用を検討しましたか10と30の develop
ブランチで? ^ /を使用したルートからの相対参照は、おそらく適切なアプローチです。
したがって、10、20、30、および40はブランチ上でアクセス可能ですが、10および30は引き続きトランクから参照されます。その後、必要に応じて認証のニーズを定義できます。
レポ
..-&gt;トランク
....-&gt; 10
....-&gt; 20
....-&gt; 30
....-&gt; 40
..-&gt;ブランチ
....-&gt;開発
......-&gt; 10(トランク上に生存、svn:externals ^ / trunk / 10)
......-&gt; 20(ブランチで存続、トランクにマージ)
......-&gt; 30(トランク上に存在、svn:externals ^ / trunk / 30)
......-&gt; 40(ブランチで存続、トランクにマージ)