GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/emacs/Other-Working-Trees.html ・ emacs-doc.conao3.com

30.1.12.6 1つのリポジトリに対する複数のワーキングツリー

一部のVCSでは、同一のバックエンドリポジトリまたはリビジョンストアを使用して、複数のワーキングツリーをサポートしています。これにより、異なるリビジョンやブランチ(バージョン管理のブランチを参照)を、別々のワーキングツリーで同時にチェックアウトしつつ、すべてのリビジョン履歴、ブランチ、タグ、およびその他のメタデータを共有することが可能です。

プロジェクトに、ソフトウェアの新バージョン3を開発しているtrunkと、バージョン2のポイントリリースを行うstable releaseブランチがあるとします。ある人から、バージョン2に存在するバグを修正するパッチが届きました。メインのワーキングツリーではバージョン3がチェックアウトされており、現在は中断したくない大規模なリファクタリングの真っ最中です。そこで、C-x v w c(後述)と入力して新しいワーキングツリーを作成し、プロンプトに従ってそこにバージョン2のブランチをチェックアウトします。

C-x v w a(後述)を使用してそのワーキングツリーにパッチを適用し、ビルドとテストを行います。問題がないことを確認した後、もう一方のワーキングツリーでC-x v P(ブランチへの変更のプル/プッシュを参照)を使用します。パッチのテスト過程で、ソフトウェアのバージョン3にもバグが存在することに気づきました。そこで、最初のワーキングツリーに戻り、C-x v m(ブランチのマージを参照)を使用して、もう一方のワーキングツリーでチェックアウトしたブランチをマージします。これで、トランクのバージョンにバージョン2の修正がすべてマージされましたが、まだリファクタリング中のため、プッシュは行っていません。後ほどC-x v Pを使用することになります。

C-x v v(バージョン管理における基本編集を参照)やC-x v d(VCディレクトリモードを参照)といった通常のVCコマンドは、他のワーキングツリーが存在する場合でも動作に変わりはありませんが、それらが作成するコミット、ブランチ、その他のVCアーティファクトが、すべてのワーキングツリーから参照可能になる点が異なります。言い換えれば、あるワーキングツリーで行った操作によってVCSのバックエンドストアに新しいアーティファクトが作成された場合、それは他のワーキングツリーからも参照可能になりますが、ワークファイルにのみ影響を与える操作は参照できません。したがって、あるワーキングツリーのワークファイルにパッチを適用した場合、その影響はそのワーキングツリーのみに及びます。しかし、そのパッチ適用による変更をコミットすると、バックエンドストアに新しいリビジョンが作成されるため、この操作は他のワーキングツリーにも影響を及ぼします。つまり、それらのワーキングツリーから見たリポジトリの履歴に、新たなコミットが追加されることになるからです。

以下の特殊コマンドを使用すると、異なるワーキングツリーを切り替えたり、変更したりできます。VCワーキングツリー内から以外――すなわち、VCSで管理されているファイルを参照しているバッファや、default-directory(ファイル名を参照)がVCワーキングツリー内にあるバッファ――からこれらを使用することはエラーとなります。

C-x v w c

新しいワーキングツリーを追加します。

C-x v w w

別のワーキングツリーにあるこのファイルまたはディレクトリを参照します。

C-x v w k

他のワーキングツリーでこのファイルを参照しているバッファを破棄する。

C-x v w s

C-x p p (project-switch-project) を呼び出すが、他のワーキングツリーに限定する。

C-x v w a

ファイルセットの変更内容を別のワーキングツリーにコピーまたは移動します。

C-x v w A

すべての変更内容を別のワーキングツリーにコピーまたは移動します。

C-x v w x

不要になったワーキングツリーを削除します。

C-x v w R

稼働中のツリーを別のファイル名にリロケーションする。

コマンド C-x v w c (vc-add-working-tree) を使用して新しいワーキングツリーを作成することで、複数のワーキングツリーを利用できるようになります。このコマンドを実行すると、ワーキングツリーを識別し、新しいワークファイル群を格納する保存先ディレクトリの指定が求められます。

VCSによって、他のワーキングツリーでチェックアウト可能な項目や必須となる項目に関するルールが異なるため、使用するVCSによっては追加のプロンプトが表示される場合があります。例えば、Gitでは各ブランチを一度に1つのワーキングツリーでのみチェックアウトすることが求められるため、Gitを使用している場合、Emacsは新しいワーキングツリーでチェックアウトするブランチ名の入力を求めます。

リポジトリに他のワーキングツリーがある場合、コマンド C-x v w w (vc-switch-working-tree) を使用してそれらを切り替えることができます。このコマンドは、現在のバッファのファイルまたはディレクトリに相当するものを、別のワーキングツリーの中から探し出そうとします。通常、異なるワーキングツリーにある作業ファイル群は、どのファイルが存在しどのファイルが存在しないかという点よりも、ファイルの内容においてより大きな違いがあります。言い換えれば、現在のバッファが参照しているファイルやディレクトリはおそらく他のワーキングツリーにも存在しており、このコマンドを使えばそれらのバージョンのファイルに切り替えることができます。

C-x v w w は、Diffモード(Diffモードを参照)およびログビューモード(VCチェンジログを参照)でも動作します。別のバッファに切り替える代わりに、このコマンドはバッファのデフォルトディレクトリを、別のワーキングツリー配下の対応するディレクトリに変更します。これは、C-x v L などのコマンドによって生成されたログビューモードのバッファ(VCチェンジログを参照)から特に有用です。C-x v w w を使用してログビューバッファのデフォルトディレクトリを変更した後、関心のあるリビジョンにポイントを移動し、= (log-view-diff) と入力することで、そのリビジョンの変更内容を含むDiffモードバッファを開くことができます。その後、C-c C-a (diff-apply-hunk) などの標準的なDiffモードコマンドを使用して、ハンクをもう一方のワーキングツリーに適用できます。

ファイル参照バッファで C-x v w w を使用すると、同一名称のファイルを参照する複数のバッファが存在することになります(バッファ名の一意化 を参照)。C-x v w k (vc-kill-other-working-tree-buffers) と入力することで、これらのバッファのうち1つを除いてすべて破棄できます。このコマンドは、現在のバッファのファイルの別ワーキングツリーにおけるバージョンを参照しているバッファを破棄し、現在のバッファを保持します。ファイル参照バッファ以外では動作しません。

ワーキングツリーを切り替える別の方法として、C-x v w s (vc-working-tree-switch-project) があります。これによりワーキングツリーの選択を求められ、その後、そのツリーを操作するためのコマンドメニューが表示されます。これは実際には単に C-x p p (project-switch-project) (プロジェクトの切り替え を参照)ですが、プロジェクトの選択範囲が他のワーキングツリーに限定されています。C-x v w w と C-x v w s の主な違いは、前者が現在のバッファに相当するものをもう一方のワーキングツリー内で検索するのに対し、後者はもう一方のワーキングツリーを独立したプロジェクトとして全体として扱う点にあります。

コマンド C-x v w a (vc-apply-to-other-working-tree) は、別のワーキングツリーを選択するよう促し、現在のワーキングツリーから別のワーキングツリーへ変更内容をコピーします。プレフィックス引数を指定すると、単にコピーするのではなく、変更内容を移動させます。通常、このコマンドは現在のVCファイルセットに対するローカルな(未コミットの)変更に対して動作します。Diffモード(Diffモードを参照)のバッファ内で呼び出された場合は、そのバッファの内容で指定された変更内容に対して動作します。変更内容のいずれかが対象のワーキングツリーに適用されない場合、コマンドは停止し、何も行いません。

C-x v w a は、変更内容を一時的なワーキングツリーにコピーしてテストする際に便利です。また、修正内容をメインのワーキングツリーにコピーしてチェックインする際にも役立ちます。例えば、一時的なワーキングツリーでバグを試行錯誤して修正したとします。その場合、修正内容をメインのワーキングツリーにコピーまたは移動して、チェックインしてプッシュすることになります。

C-x v w A コマンドも同様の動作をしますが、現在の VC ファイルセットへの変更や Diff モードバッファの内容で表される変更だけでなく、すべてのローカルな変更を常にワーキングツリー全体にコピーまたは移動させる点が異なります。2つのプレフィックス引数を指定すると、このコマンドはコピー対象となる変更のプレビューを表示し、C-c C-a や C-c <RET> a といった標準的な Diff モードコマンドを用いてそれらを適用できるようになります(Diff モード を参照)。(C-u C-u C-x v w A は、概ね C-x v D と続けて C-x v w w と入力することと同等です。)

コマンド C-x v w x (vc-delete-working-tree) および C-x v w R (vc-move-working-tree) は、他のワーキングツリーに対してメンテナンス作業を行うためのもので、削除、移動、名前変更が可能です。特に他のワーキングツリーの削除は有用です。というのも、複数のワーキングツリーを利用する一般的な用途として、メインのワーキングツリーで進行中の作業を妨げることなく、変更内容を迅速にテストするためのリポジトリの使い捨てコピーを作成することが挙げられるからです。