作業コピーの切り替え

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ユーザは ブランチを利用するときにはよく、特定のやり方をします。:

  1. プロジェクトの「幹(trunk)」全体を新しいブランチディレクトリ にコピーする。

  2. 幹(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の章を見てください。