svn switch コマンドは存在している作業コピーを
別のブランチに変換します。このコマンドはブランチで作業するのに
常に必要というわけではありませんが、ユーザに対して便利なショートカット
を用意します。前の例で、プライベートなブランチを作ったあと、その新しい
リポジトリディレクトリの作業コピーをチェックアウトしました。そうする
かわりに、単に/calc/trunk
の作業コピーを新しい
ブランチの場所のコピーに変更することができます:
$ cd calc $ svn info | grep URL URL: http://svn.example.com/repos/calc/trunk $ svn switch http://svn.example.com/repos/calc/branches/my-calc-branch U integer.c U button.c U Makefile Updated to revision 341. $ svn info | grep URL URL: http://svn.example.com/repos/calc/branches/my-calc-branch
ブランチに「スイッチ」したあとでは、作業コピーの内容はそのディレクトリ を新しくチェックアウトした場合とまったく同じものになります。そして 普通このコマンドを使うほうがより効率的です。というのは、たいてい ブランチはほんの少し内容が違うだけです。サーバはそのブランチディレクトリ を反映させるために作業コピーにしなくてはならない最小限の変更だけを 送信すれば済むのです。
svn switch は--revision
(-r
) オプションをとることもできるので、常に作業コピー
をブランチの「最新状態」にに移す必要があるわけではありません。
もちろん、ほとんどのプロジェクトはcalc
よりは
もっと複雑で、複数のサブディレクトリを含んでいます。Subversionユーザは
ブランチを利用するときにはよく、特定のやり方をします。:
プロジェクトの「幹(trunk)」全体を新しいブランチディレクトリ にコピーする。
幹(trunk)の作業コピーの一部のみを ブランチにミラーする。
言い換えると、ユーザが特定のサブディレクトリ上でだけブランチの作業が起きる ことを知っている場合にはsvn switchを使ってブランチに そのサブディレクトリのみを移動します。(あるいは、たった一つの作業ファイル だけをブランチに switch することさえあります!) その方法では、作業コピー のほとんどすべての更新を普通の「幹(trunk)」から従来どおり受け取ることが できますが、切り替えた部分だけは変更されることなく残ります(もしブランチ に対して誰かが変更点をコミットしさえしなければ)。この機能は 「混合作業コピー」という概念にまったく新しい次元を付け加える ことになります—作業コピーは作業リビジョンの混合を含むことができる だけではなく、リポジトリ位置の混合も含むことができます。
もし作業コピーが異なるリポジトリ位置からのスイッチされたサブツリー をいくつか含むなら、それは普通に機能し続けます。更新すると、 それぞれのサブツリーのパッチを適切に受け取るでしょう。コミットすると ローカル修正は一つの不可分の変更をリポジトリに適用するでしょう。
リポジトリ位置の混合を作業コピーに反映させることはできますが、 このようなリポジトリ位置はすべて同じ リポジトリ の中になくてはなりません。Subversionのリポジトリはまだお互いに通信 することはできません。これはSubversion1.0以降で計画されている機能です。 [12]
svn switch は本質的にはsvn update の変種なので、同じ動作を共有します。作業コピー中のどのようなローカルの 変更もリポジトリから新しいデータが届くときに保存されます。これで あらゆる利口な小技がきくようになります。
たとえば/calc/trunk
の作業コピーがありそれにいくつか
変更を加えたとします。それから突然、本当はブランチにやる変更だったことに
気づきます。問題ありません。作業コピーをsvn switch
でブランチにスイッチしても、ローカルの変更はそのまま残ります。で、
それをブランチに対してテストし、コミットすることができます。
[12] しかし、サーバ上の URL が変更されたが、既存の作業コピー
を捨てたくない場合には、--relocate
スイッチ付きで
svn switchを使うことはできます。
より詳しい情報と例については章 9. Subversion リファレンスの
svn switchの章を見てください。