はい、承知いたしました。Subversion(SVN)における「チェックアウト解除」に関する詳細な手順とやり方を、様々なシナリオを含めて約5000語で解説する記事を作成します。SVNには明確な「チェックアウト解除」というコマンドは存在しないため、ユーザーがその言葉で意図するであろう複数の状況を想定し、それぞれに対応する正しい操作方法を詳解します。
以下に記事の全文を表示します。
SVN「チェックアウト解除」のすべて – 意図別完全ガイド(約5000語超詳解)
Subversion(SVN)は、多くの開発現場やプロジェクトで利用されている集中型バージョン管理システムです。ファイルやディレクトリの変更履歴を管理し、複数のメンバー間での共同作業を効率化するために欠かせないツールです。
SVNを利用する上で、「チェックアウト」は最も基本的な操作の一つです。リポジトリからプロジェクトのファイルをローカルコンピューターに取得し、「作業コピー」を作成する操作を指します。
しかし、SVNを使っていると、「チェックアウトを解除したい」「チェックアウトされた状態をリセットしたい」といった状況に遭遇することがあります。この「チェックアウト解除」という言葉は、実はSVNの正式なコマンド名ではありません。ユーザーがこの言葉を使うとき、その背後にはいくつかの異なる意図が隠されています。
この記事では、ユーザーが「チェックアウト解除」という言葉で何を意図しているのかを様々なシナリオに分解し、それぞれの状況で取るべきSVNの正しい操作方法を、詳細な手順、コマンド例、注意点、さらにはGUIツールでの操作方法も含めて、約5000語の大ボリュームで徹底解説します。
この記事を読めば、「チェックアウト解除」にまつわる疑問が解消され、SVN作業コピーの状態を適切に管理できるようになるでしょう。
目次
- はじめに – SVNと「チェックアウト解除」の誤解
- Subversion(SVN)とは
- SVNの基本操作:チェックアウト(
svn checkout
)とは - なぜ「チェックアウト解除」という言葉が使われるのか
- SVNに「チェックアウト解除」コマンドは存在しない
- この記事で扱う主要なシナリオ
- 最も一般的な意図 – 不要なローカル作業コピーを削除する
- シナリオ:ローカルの作業領域がもう必要ない
- 手順:作業コピーディレクトリの物理的な削除
- Windows (エクスプローラー) での手順
- macOS (Finder) での手順
- Linux (rmコマンド) での手順と注意点
- 削除前に必ず確認すべきこと:未コミットの変更の有無
svn status
コマンドによる確認- 未コミット変更がある場合の選択肢
- この方法のメリットとデメリット
- GUIツール(TortoiseSVNなど)での作業コピー削除方法
- ローカルの未コミット変更を破棄する –
svn revert
の活用- シナリオ:加えた変更を元に戻したい、作業をやり直したい
svn revert
コマンドの詳細な解説- コマンドの基本構文と役割
- ターゲットの指定(ファイル、ディレクトリ)
- オプション
--recursive
/-R
の重要性 - 特定のファイルやディレクトリの変更のみを破棄する
- 作業コピー全体を特定の状態に戻す
svn status
の出力とsvn revert
の関係(M, A, D, ? など)- 衝突(Conflict)状態の解消としての
svn revert
- 未追加(?)ファイルへの影響
- 削除済み(!)ファイルへの影響
svn revert
実行後の確認
svn revert
の注意点とリスク:一度破棄した変更は戻せないsvn revert
のメリットとデメリット- GUIツール(TortoiseSVNなど)での Revert 操作方法
- 作業コピーの状態をクリーンにする/修復する –
svn cleanup
とその他の手段- シナリオ:作業コピーがロックされた、操作が中断されたなど
svn cleanup
コマンドの詳細な解説- コマンドの基本構文と役割(特に
.svn
ディレクトリ内のロック解除) - いつ
svn cleanup
を使うべきか svn cleanup
で解決できる問題、解決できない問題
- コマンドの基本構文と役割(特に
svn update
による状態の最新化・修復--revision
オプションによる特定の時点への戻し/進め
- 作業コピーの削除と再チェックアウトによる根本的な修復
- 未コミット変更がある場合の対処法(パッチ作成と適用)
- これらの方法のメリットとデメリット
- GUIツール(TortoiseSVNなど)での Cleanup および Update 操作方法
- リポジトリからファイル/ディレクトリを削除する –
svn delete
の正確な理解- シナリオ:バージョン管理自体から項目を外したい
svn delete
コマンドの詳細な解説svn delete URL
とsvn delete PATH
の違い- ローカル作業コピー上での削除 (
svn delete PATH
) とコミット - リポジトリブラウザからの削除 (
svn delete URL
) svn delete
が「チェックアウト解除」ではない理由- 削除したファイルをローカルに保持したい場合の特殊な手順
svn:ignore
プロパティとの違い- GUIツール(TortoiseSVNなど)での Delete 操作方法
- その他の関連操作 –
svn unlock
などsvn unlock
:ロックの解除- ロックとは何か、なぜ必要か
svn unlock
の使い方と--force
オプション
svn switch
:作業コピーを別のブランチ/タグに切り替える
- まとめと推奨プラクティス
- 「チェックアウト解除」という言葉の不正確さの再確認
- ユーザーの意図に応じた適切なコマンドの選択リスト
- 操作前には必ず
svn status
で状態確認する習慣を - 重要な操作前の慎重な確認とバックアップ
- GUIツールの活用推奨
- 付録:GUIツール (TortoiseSVN) での操作早見表
1. はじめに – SVNと「チェックアウト解除」の誤解
Subversion(SVN)とは
Subversion (SVN) は、集中型バージョン管理システム (Centralized Version Control System, CVCS) の一種です。プロジェクトのファイルやディレクトリの変更履歴を単一のリポジトリ(中央サーバーなど)で一元管理します。開発者や利用者は、リポジトリからファイルのコピーを取得して作業を行い、変更をリポジトリに反映させることで、バージョン管理や共同作業を行います。
SVNの主な特徴は以下の通りです。
- リポジトリ: すべてのファイル、ディレクトリ、およびその履歴が保存される場所です。通常、ネットワーク上のサーバーに置かれます。
- リビジョン: リポジトリに対する変更のコミットごとに割り当てられる一意の番号です。リビジョン番号を追うことで、プロジェクトの過去の任意の時点の状態を再現できます。
- 作業コピー: リポジトリからチェックアウトされた、ローカルコンピューター上のファイルやディレクトリのコピーです。ユーザーはこの作業コピー上でファイルの編集、追加、削除などの作業を行います。
- コミット(
svn commit
): 作業コピーでの変更内容をリポジトリに送信し、新しいリビジョンを作成する操作です。 - アップデート(
svn update
): リポジトリの最新の変更を作業コピーに取り込む操作です。他のユーザーがコミットした内容を自分の作業コピーに反映させます。 - チェックアウト(
svn checkout
): リポジトリの指定したURLから、プロジェクトの最新(または指定したリビジョン)の状態を作業コピーとしてローカルに取得する操作です。
SVNの基本操作:チェックアウト(svn checkout
)とは
svn checkout
コマンドは、SVNを利用する上で最初に必要な操作の一つです。これにより、リモートのリポジトリにあるファイルやディレクトリを、自分のローカル環境にコピーして「作業コピー」を作成します。
基本的な構文は以下のようになります。
bash
svn checkout リポジトリURL [作業コピーのパス]
リポジトリURL
: チェックアウトしたいリポジトリ内のパスを指定します。プロジェクト全体のルート、特定のブランチ、タグ、あるいはサブディレクトリなどを指定できます。例:svn://example.com/repos/myproject/trunk
[作業コピーのパス]
: オプションです。ローカルに作業コピーを作成するディレクトリのパスを指定します。省略した場合、URLの最後の部分(例:trunk
)の名前で現在のディレクトリ内に作成されます。
例:
“`bash
リポジトリURLの最後に指定された名前(trunk)で作業コピーを作成
svn checkout svn://example.com/repos/myproject/trunk
指定したディレクトリ名(myproject_workingcopy)で作業コピーを作成
svn checkout svn://example.com/repos/myproject/trunk myproject_workingcopy
“`
svn checkout
を実行すると、指定したパスにディレクトリが作成され、その中にリポジトリの内容がコピーされます。このとき、各ディレクトリの内部には .svn
という隠しディレクトリが作成されます。この .svn
ディレクトリには、その作業コピーがどのリポジトリのどのURLのどのリビジョンからチェックアウトされたか、ローカルでの変更点、ステータス、キャッシュなどの情報が保存されており、SVNが作業コピーを管理するために不可欠なものです。
なぜ「チェックアウト解除」という言葉が使われるのか
SVNのコマンドには checkout
はありますが、対応する uncheckout
や release_checkout
といったコマンドは存在しません。しかし、ユーザーが「チェックアウト解除」という言葉を使う状況はいくつか考えられます。これは、SVNにおける「チェックアウトされた状態」を、何らかの理由で終わらせたい、元に戻したい、あるいはその状態を無効にしたい、といった漠然とした意図を表現していることが多いです。
具体的には、以下のような状況で「チェックアウト解除」という言葉が使われる可能性が考えられます。
- ローカルの作業コピーがもう不要になった: プロジェクトの作業が完了した、別のプロジェクトに移動した、単に試してみただけだったなど、ローカルに取得したファイル一式(作業コピー)が不要になったので削除したい。
- ローカルに加えた未コミットの変更を破棄したい: ファイルを編集したり、新しいファイルを追加したり、ファイルを削除したりしたが、これらの変更をリポジトリにコミットするのではなく、チェックアウト直後の状態に戻したい。
- 作業コピーが壊れた/古くなったので作り直したい: 作業コピーの状態がおかしくなった(例: ロックがかかって操作できない、アップデートがうまくいかない、競合が解消できないなど)ため、一度ローカルの状態をリセットして、リポジトリから改めてクリーンな状態を取得したい。
- 特定のファイルやディレクトリをバージョン管理から外したい: 作業コピー内の一部のファイルやディレクトリだけを、リポジトリでの管理対象から外したい。
- リポジトリとの接続を一時的に切りたい: あまり一般的なケースではありませんが、ネットワークに接続できない環境で作業したい場合など、ローカルのファイルはそのままに、SVNの管理下にある状態を一時的に解除したい(SVNでは通常、
.svn
ディレクトリがある限り管理下にあります)。
これらの意図は、それぞれSVNにおける全く異なる操作に対応します。
SVNに「チェックアウト解除」コマンドは存在しない
前述の通り、SVNには svn uncheckout
やそれに類するコマンドはありません。これは、Gitなどの一部の分散型バージョン管理システムとは設計思想が異なるためです。SVNは集中型であり、リポジトリから「チェックアウト」してローカルに「作業コピー」を作成するモデルを取ります。この作業コピーは、ローカルのファイルシステム上の単なるディレクトリですが、内部の .svn
ディレクトリによってリポジトリと関連付けられています。
この「関連付け」を解除したり、作業コピーをSVN管理下から外したりするような単一のコマンドは存在しません。ユーザーが何を達成したいかに応じて、適切なSVNコマンド(またはファイルシステム操作)を選択する必要があります。
この記事で扱う主要なシナリオ
この記事では、「チェックアウト解除」という言葉の背後にあるであろう最も一般的な意図に焦点を当て、それぞれの場合の具体的な手順を解説します。扱う主要なシナリオは以下の通りです。
- シナリオ1: 不要になったローカル作業コピーを完全に削除する。
- シナリオ2: ローカルに加えた未コミットの変更を破棄し、元の状態に戻す。
- シナリオ3: 作業コピーが壊れたり、古くなったりした場合に、状態をクリーンにする、または再構築する。
- シナリオ4: (補足として)リポジトリから特定のファイルやディレクトリをバージョン管理対象から削除する。
これらのシナリオごとに、対応するSVNコマンド(または非SVN操作)の詳細、手順、コマンド例、注意点、そしてGUIツールでの操作方法を詳しく見ていきましょう。
2. 最も一般的な意図 – 不要なローカル作業コピーを削除する
「チェックアウト解除」という言葉でユーザーが最も頻繁に意図するのは、「もうこのプロジェクトでの作業をしないので、ローカルにあるファイルを全て削除したい」というケースです。これはSVNコマンドによる操作ではなく、単にファイルシステム上のディレクトリを削除する操作で実現します。
シナリオ:ローカルの作業領域がもう必要ない
あなたは以前にSVNリポジトリからプロジェクトを作業コピーとしてチェックアウトしました。しかし、そのプロジェクトでの作業が完了した、プロジェクト自体が終了した、あるいは別の方法でファイルを取得するようになったなど、様々な理由で、その作業コピーがローカルコンピューター上に不要になったとします。この場合、単にそのディレクトリを物理的に削除してしまえば、「チェックアウト解除」された状態、つまりSVN管理下のローカルコピーが存在しない状態になります。
手順:作業コピーディレクトリの物理的な削除
不要になったSVN作業コピーを削除する手順は、使用しているOSによって異なりますが、基本的な考え方は同じです。作業コピーのルートディレクトリ(svn checkout
を実行したときに作成されたディレクトリ)を、隠しディレクトリである .svn
サブディレクトリを含めて完全に削除します。
注意: この操作を行うと、その作業コピーに加えられた未コミットの変更はすべて失われます。削除を実行する前に、未コミットの変更がないか、あるいはその変更が本当に不要であるかを必ず確認してください(確認方法は後述)。
Windows (エクスプローラー) での手順
- 不要になったSVN作業コピーのルートディレクトリをエクスプローラーで開きます。
- ルートディレクトリ(例:
C:\Users\YourName\Documents\myproject
など)を右クリックします。 - コンテキストメニューから「削除」または「ごみ箱」を選択します。
- 確認のダイアログが表示されたら、「はい」をクリックして削除を実行します。
これで、作業コピーとその中のすべてのファイル、およびSVN関連情報が格納された .svn
ディレクトリがごみ箱に移されるか、完全に削除されます。
macOS (Finder) での手順
- 不要になったSVN作業コピーのルートディレクトリをFinderで開きます。
- ルートディレクトリ(例:
/Users/YourName/Documents/myproject
など)を選択します。 - メニューバーの「ファイル」から「ゴミ箱に入れる」を選択するか、ディレクトリをDockのごみ箱アイコンにドラッグ&ドロップします。
- 確認のダイアログが表示されたら、OKをクリックします。
これで、作業コピーとその中のすべてのファイル、およびSVN関連情報が格納された .svn
ディレクトリがごみ箱に移されます。
Linux (rmコマンド) での手順と注意点
Linux環境では、rm
コマンドを使用してディレクトリを削除します。SVN作業コピーの削除も同様です。
bash
rm -rf /path/to/your/workingcopy
rm
: ファイルやディレクトリを削除するコマンドです。-r
: ディレクトリとその内容を再帰的に削除するオプションです。-f
: 削除の確認メッセージを表示せず、強制的に削除するオプションです。
注意: rm -rf
コマンドは非常に強力で危険なコマンドです。指定したパスにあるディレクトリとその中身を、確認なしに完全に削除してしまいます。誤ったパスを指定すると、システムファイルや他の重要なファイルを消してしまう可能性があります。実行する際は、パスが本当に削除したいSVN作業コピーのルートディレクトリであることを二重三重に確認してください。
/path/to/your/workingcopy
の部分を、削除したいSVN作業コピーのルートディレクトリの絶対パスまたは現在のディレクトリからの相対パスに置き換えて実行します。
例:
“`bash
現在のディレクトリにある ‘myproject’ という作業コピーを削除
rm -rf myproject
指定した絶対パスの作業コピーを削除
rm -rf /home/yourname/projects/old_project_wc
“`
このコマンドを実行すると、指定したディレクトリとその中のすべてのファイル、および .svn
ディレクトリが完全に削除され、復元は基本的に不可能になります。
削除前に必ず確認すべきこと:未コミットの変更の有無
SVN作業コピーを物理的に削除する前に、その作業コピー内にリポジトリにまだコミットしていない変更(ファイルの編集、新規追加、削除など)がないかを必ず確認してください。未コミットの変更がある状態でディレクトリを削除すると、その変更内容は完全に失われます。
変更の有無を確認するには、作業コピーのルートディレクトリ(またはそのサブディレクトリ)で svn status
コマンドを実行します。
bash
cd /path/to/your/workingcopy
svn status
svn status
コマンドは、作業コピーの状態を表示します。主なステータスコードとその意味は以下の通りです。
(スペース): バージョン管理されているファイルで、変更なし。
A
: 新規に追加されたファイルまたはディレクトリ。まだコミットされていない。D
: 削除されたファイルまたはディレクトリ。まだコミットされていない。M
: 変更されたファイル。C
: 衝突(Conflict)が発生しているファイル。?
: バージョン管理下にないファイルまたはディレクトリ。!
: ファイルまたはディレクトリがバージョン管理下にあると記録されているが、ローカルの作業コピーから見つからない(削除されたか移動された)。
svn status
の出力に A
, D
, M
, C
, !
といったステータスを持つファイルが表示された場合、その作業コピーには未コミットの変更が存在します。?
ステータスのファイルはバージョン管理下にないので、削除してもリポジトリには影響しません(ローカルからそのファイルが消えるだけです)。
未コミット変更がある場合の選択肢
svn status
で未コミットの変更が見つかった場合、その変更をどうするかを決めます。
- 変更をリポジトリに保存したい場合:
- 変更内容を確認し、問題なければ
svn commit
コマンドでリポジトリにコミットします。 - コミットが成功すれば、その変更はリポジトリの履歴として永続化されます。その後、安心して作業コピーディレクトリを削除できます。
- 変更内容を確認し、問題なければ
- 変更は不要で破棄したい場合:
- その変更が本当に不要であれば、物理的なディレクトリ削除を進めて問題ありません。未コミット変更は削除とともに失われます。
- 特定の未コミット変更だけを破棄したい場合は、先に
svn revert
コマンドを使用して必要なファイルやディレクトリの変更を元に戻すことも可能です(svn revert
の詳細は後述)。全ての変更を破棄し、作業コピーをチェックアウト直後の状態に戻してからディレクトリを削除するのも良いでしょう。
いずれの場合も、未コミットの重要な作業が誤って失われないよう、削除前にステータス確認と意思決定を怠らないことが非常に重要です。
この方法のメリットとデメリット
メリット:
- 最もシンプルで確実: 不要になった作業コピーを物理的に削除することは、最も簡単で直接的な方法です。SVN管理下から外すという目的に対して最もシンプルです。
- ディスク容量の解放: 作業コピーが占有していたディスク容量を解放できます。
デメリット:
- 未コミット変更の喪失: 削除時に未コミットの変更がすべて失われます。事前にコミットまたは退避させていない場合、後から変更内容を取り出すことはできません。
- 復元の困難さ: 一度削除した作業コピーは、リポジトリから再チェックアウトすることは可能ですが、ローカルで独自に加えられた情報(
.svn
ディレクトリ以外の、バージョン管理対象外のファイルや設定ファイルなど)は失われる可能性があります。また、削除時点での正確な状態(ローカル変更含む)を復元することは困難です。
GUIツール(TortoiseSVNなど)での作業コピー削除方法
Windowsで広く使われているGUIクライアントであるTortoiseSVNを使用している場合も、基本的にはエクスプローラーでのディレクトリ削除と同じです。
- 不要になったSVN作業コピーのルートディレクトリをエクスプローラーで開きます。
- ルートディレクトリを右クリックします。
- メニューから「削除」を選択します。
TortoiseSVNは、SVN管理下のディレクトリ(.svn
ディレクトリが存在するディレクトリ)であるかどうかにかかわらず、Windowsの通常のファイル削除として処理します。削除前にTortoiseSVNのアイコンオーバーレイで未コミットの変更(赤い感嘆符など)が表示されていないか確認することもできます。変更がある場合は、コミットや Revert といったTortoiseSVNのメニュー項目が利用できるはずです。
他のGUIツール(macOSのCornerstone、LinuxのRapidSVNなど)でも同様に、ファイルマネージャーやツール内の機能を使って作業コピーのルートディレクトリを削除します。
結論として、不要な作業コピーを削除することが「チェックアウト解除」の意図であれば、単にディレクトリを物理的に削除するのが最も適切な方法です。ただし、未コミット変更の確認は必須です。
3. ローカルの未コミット変更を破棄する – svn revert
の活用
次に、「チェックアウト解除」という言葉が、「ローカルで加えた変更を元に戻したい」「作業コピーをリポジトリの最新状態(または特定の状態)に戻したい」という意図で使われるケースを考えます。この場合は、作業コピー自体を削除する必要はなく、svn revert
コマンドを使用します。
シナリオ:加えた変更を元に戻したい、作業をやり直したい
あなたはリポジトリからファイルをチェックアウトし、作業を開始しました。ファイルを編集したり、新しいファイルを作成したり、既存のファイルを削除したりしました。しかし、その作業がうまくいかなかった、あるいは全く別の方法で作業し直したいと思ったとします。これらのローカルの変更をリポジトリにコミットするのではなく、作業コピーをこれらの変更を加える前の状態に戻したい。このような場合に svn revert
コマンドが役立ちます。
svn revert
コマンドは、作業コピー内の特定のファイルやディレクトリに加えられたローカルの変更を破棄し、作業コピーを「ベースリビジョン」(通常は最後に svn update
や svn checkout
した時点のリポジトリの状態)に戻します。
svn revert
コマンドの詳細な解説
コマンドの基本構文と役割
svn revert
コマンドは、作業コピー内のファイルやディレクトリを指定して実行します。
bash
svn revert TARGET...
TARGET
: 変更を破棄したいファイルまたはディレクトリのパスを指定します。複数のターゲットを指定できます。
svn revert
を実行すると、指定されたターゲットのローカル変更が破棄されます。
例:
“`bash
foo.c というファイルのローカル変更を破棄する
svn revert foo.c
bar/ というディレクトリ内のローカル変更を破棄する
(デフォルトでは再帰的ではない点に注意)
svn revert bar/
“`
ターゲットの指定(ファイル、ディレクトリ)
svn revert
コマンドは、特定のファイル、特定のディレクトリ、あるいは作業コピー全体に対して実行できます。
- 特定のファイル:
svn revert path/to/file.ext
のように、ファイルへのパスを指定します。 - 特定のディレクトリ:
svn revert path/to/directory
のように、ディレクトリへのパスを指定します。ただし、デフォルトでは非再帰的です。ディレクトリを指定しても、そのディレクトリ自体のプロパティ変更は戻りますが、ディレクトリ内のファイルやサブディレクトリの変更は戻りません。
オプション --recursive
/ -R
の重要性
ディレクトリとその中のすべてのファイルやサブディレクトリの変更を再帰的に破棄したい場合は、--recursive
または -R
オプションを付けます。
“`bash
mydir/ ディレクトリとその中のすべての変更を破棄する
svn revert -R mydir/
現在のディレクトリ (.) およびその中のすべての変更を破棄する(作業コピー全体を戻すのに便利)
svn revert -R .
“`
-R .
は、現在のディレクトリをルートとする作業コピー全体(またはその一部)の未コミット変更を全て破棄する際によく使われます。
特定のファイルやディレクトリの変更のみを破棄する
svn status
コマンドで状態を確認し、破棄したい特定のファイルやディレクトリを選択して svn revert
を実行します。
手順:
1. 作業コピーのルートディレクトリで svn status
を実行し、現在の変更状態を確認します。
bash
svn status
出力例:
M foo.c
A new_file.txt
D old_dir/
M subdir/another.c
? temp.log
2. 上記の例で、foo.c
の変更だけを破棄したい場合は、以下のコマンドを実行します。
bash
svn revert foo.c
実行後、svn status
を再度実行すると、foo.c
のステータスが M
から に戻っていることが確認できます。
new_file.txt
(A
), old_dir/
(D
), subdir/another.c
(M
) は変更されたままです。
作業コピー全体を特定の状態に戻す
通常、「特定の状態」とはチェックアウトした直後や最後に svn update
を実行した時点の状態(= 作業コピーのベースリビジョン)を指します。作業コピー全体をその状態に戻すには、ルートディレクトリで -R .
を付けて svn revert
を実行します。
bash
cd /path/to/your/workingcopy
svn revert -R .
このコマンドは、作業コピー内のすべてのバージョン管理下のファイル/ディレクトリに対して、ローカルの変更を破棄します。
M
(Modified) ファイルは、ベースリビジョンの内容に戻ります。A
(Added) ファイル/ディレクトリは、削除されます。D
(Deleted) ファイル/ディレクトリは、ベースリビジョンから復元されます。!
(Missing) ファイル/ディレクトリは、ベースリビジョンから復元されます。C
(Conflict) ファイルは、衝突マーカーが除去され、ベースリビジョンの内容に戻ります。
重要な注意点: ?
(Unversioned) ステータスのファイルは、svn revert
の対象外です。これらのファイルはSVNの管理下にないため、svn revert
では削除されません。もし ?
ファイルも一緒に削除したい場合は、ファイルシステム上で別途削除する必要があります。
svn status
の出力と svn revert
の関係(M, A, D, ? など)
svn status
の各ステータスが svn revert
によってどのように変化するかをまとめます。
M
(Modified):svn revert
すると、変更が破棄され、ファイルはベースリビジョンの内容に戻ります。ステータスはになります。
A
(Added):svn revert
すると、作業コピーから削除されます。ステータスは消えます。D
(Deleted):svn revert
すると、ベースリビジョンからファイル/ディレクトリが復元されます。ステータスはになります。
!
(Missing):svn revert
すると、ベースリビジョンからファイル/ディレクトリが復元されます。ステータスはになります。
C
(Conflict):svn revert
すると、衝突マーカーが削除され、ファイルはベースリビジョンの内容に戻ります。ステータスはになります。
?
(Unversioned):svn revert
の対象外です。ステータスは?
のままです。
衝突(Conflict)状態の解消としての svn revert
svn update
や svn merge
の際に衝突が発生し、ファイルが C
ステータスになったとします。衝突を解決するには手動でファイルを編集する方法が一般的ですが、もしその衝突したファイルのローカル変更を全て破棄し、リポジトリ側(通常は最新リビジョン)の内容で上書きしたい場合は、svn revert
が手軽な方法です。
“`bash
衝突したファイル foo.c のローカル変更を破棄し、最新の内容で上書き
svn revert foo.c
“`
これにより、衝突マーカー(<<<<<<<
, =======
, >>>>>>>
など)が除去され、ファイルの内容がベースリビジョン(または update
や merge
で取得しようとしていたリビジョン)の状態に戻ります。
svn revert
実行後の確認
svn revert
コマンドは、実行されたファイル/ディレクトリに対してメッセージを出力します。
例:
bash
$ svn revert foo.c bar/
Reverted 'foo.c'
Reverted 'bar'
再帰的に実行した場合は、対象となったファイルごとに Reverted '...'
のメッセージが出力されます。
コマンド実行後に再度 svn status
を実行し、意図した通りにステータスが変わっているかを確認することが推奨されます。
svn revert
の注意点とリスク:一度破棄した変更は戻せない
svn revert
の最も重要な注意点は、この操作が不可逆であるということです。svn revert
によって破棄されたローカルの変更内容は、特別なツールや手段を使わない限り、原則として元に戻すことができません。ローカルでの編集履歴は失われます。
そのため、svn revert
を実行する前に、破棄しようとしている変更内容が本当に不要であるか、あるいは必要であれば事前にどこかにバックアップ(パッチとして保存するなど)を取っておくべきです。特に -R
オプションを使って作業コピー全体を revert する場合は、影響範囲が広いため細心の注意が必要です。
svn revert
のメリットとデメリット
メリット:
- 特定の変更のみを破棄できる: ファイル単位やディレクトリ単位で、ピンポイントで変更を破棄できます。
- 作業コピーの再作成が不要: 作業コピー全体を削除して再チェックアウトするよりも、はるかに高速かつ手軽です。ネットワークトラフィックも少なくて済みます。
- 衝突解消の手段: 衝突が発生した際、手動解決が面倒な場合にローカル変更を破棄してリポジトリ側の内容を採用する手段として使えます。
デメリット:
- 変更の不可逆性: 一度破棄したローカル変更は取り戻せません。
?
ファイルは対象外: バージョン管理下にない(Unversioned)ファイルはrevert
されないため、必要に応じて別途削除が必要です。
GUIツール(TortoiseSVNなど)での Revert 操作方法
TortoiseSVNでは、Revert 操作は非常に直感的に行えます。
- 変更を破棄したいファイルまたはディレクトリをエクスプローラーで選択します。作業コピー全体の場合は、ルートディレクトリを選択します。
- 右クリックします。
- TortoiseSVNのコンテキストメニューから「TortoiseSVN」->「Revert…」を選択します。
- 「Revert」ダイアログが表示されます。このダイアログには、選択したディレクトリ内の(再帰的に)変更されたファイルやディレクトリのリストが表示されます。
- Revertしたい項目にチェックを入れます。作業コピー全体の変更を破棄したい場合は、「Select All」ボタンをクリックするか、リスト上の全ての項目にチェックが入っていることを確認します。
- 「OK」ボタンをクリックします。
- 確認のダイアログが表示されることがあります。「OK」をクリックすると Revert が実行されます。
Revert が完了すると、結果が表示されます。TortoiseSVNのアイコンオーバーレイも、Revertされたファイルのステータスに応じて更新されます(例: 赤い感嘆符が消える)。
このように、GUIツールでは、コマンドラインよりも視覚的にどのファイルが変更され、どれを revert するかを選択できるため、初心者には扱いやすいかもしれません。
結論として、ローカルの未コミット変更を破棄したいことが「チェックアウト解除」の意図であれば、svn revert
コマンド(またはGUIツールでの Revert 機能)を使用するのが適切な方法です。
4. 作業コピーの状態をクリーンにする/修復する – svn cleanup
とその他の手段
「チェックアウト解除」という言葉は、作業コピーの状態が何らかの理由で不安定になったり、エラーが発生して操作が進まなくなったりした場合に、「一度クリーンな状態に戻したい」「おかしくなった状態をリセットしたい」という意図で使われることもあります。このような場合、svn cleanup
コマンドや、作業コピーの削除・再チェックアウトといった手段が有効です。
シナリオ:作業コピーがロックされた、操作が中断されたなど
SVNの操作(コミット、アップデート、スイッチなど)が何らかの理由で中断されたり、エラーが発生したりすると、作業コピーが不安定な状態になることがあります。最も一般的なのは、作業コピーディレクトリ内にロックファイルが残ってしまい、以降のSVN操作(アップデートやコミットなど)を実行しようとすると「cleanupが必要です」といったエラーメッセージが表示されるケースです。
このような、作業コピー内部の状態がおかしくなってしまった場合に、その状態を修復し、次の操作に進めるようにするために使用するのが svn cleanup
コマンドです。
svn cleanup
コマンドの詳細な解説
コマンドの基本構文と役割(特に.svn
ディレクトリ内のロック解除)
svn cleanup
コマンドは、作業コピー内の不要なロックを解除したり、中断された操作の後始末をしたりして、作業コピーの状態を健全に戻すためのコマンドです。
bash
svn cleanup [PATH...]
[PATH...]
: クリーンアップしたい作業コピーのディレクトリを指定します。省略した場合、現在のディレクトリに対して実行されます。通常は作業コピーのルートディレクトリを指定します。
svn cleanup
が行う主な処理は以下の通りです。
- 不要なロックの解除: SVNは操作中に作業コピーの一部や全体をロックすることがありますが、操作が異常終了した場合、このロックが残ってしまうことがあります。
svn cleanup
はこのような残存ロックを探して解除します。これがcleanup
が最もよく使われる目的です。 - ログファイルの実行: SVNは、複雑な操作を複数のステップに分解し、
.svn/tmp
ディレクトリなどに一時的な「ログファイル」として記録することがあります。操作が中断された場合、これらのログファイルが未処理で残る可能性があります。svn cleanup
はこれらのログファイルを探し出し、未完了だった操作を実行して後始末をします。 - その他のクリーンアップ: 作業コピーの状態を整合性のあるものに戻すための内部的な処理を行います。
例:
“`bash
現在のディレクトリにある作業コピーをクリーンアップ
svn cleanup
指定したパスの作業コピーをクリーンアップ
svn cleanup /path/to/my/workingcopy
“`
いつ svn cleanup
を使うべきか
以下のような状況で、svn cleanup
を試みる価値があります。
- 「作業コピーはロックされています; cleanupが必要です」といったエラーメッセージが表示された場合。
svn update
やsvn commit
などのSVN操作が途中で中断された後。- 作業コピーの特定の操作(スイッチ、マージなど)がうまくいかなかった後。
- 作業コピーの状態がどうもおかしい、不明なエラーが出る、といった場合。
svn cleanup
で解決できる問題、解決できない問題
- 解決できる問題の例: ロックによる操作不能、中断された操作の後始末、作業コピー内部の軽微な不整合。
- 解決できない問題の例:
- 未コミットの変更の破棄:
svn cleanup
はローカルのファイル内容そのものや、ファイルやディレクトリの追加/削除といった未コミット変更には影響しません。これらを破棄したい場合はsvn revert
を使います。 - リポジトリとの接続問題: リポジトリサーバーにアクセスできない、ネットワークの問題、認証の問題などは
cleanup
では解決しません。 - 深刻な作業コピーの破損: ごく稀に、
.svn
ディレクトリの内容が深刻に破損してしまった場合など、cleanup
では修復できないこともあります。
- 未コミットの変更の破棄:
svn update
による状態の最新化・修復
svn cleanup
でロックが解除されたりしても、作業コピーがまだ古い状態であったり、リポジトリと完全に同期していない状態であったりする場合があります。この場合は、svn update
を実行して、リポジトリの最新の状態を作業コピーに反映させることで、状態を健全に戻すことができます。
bash
cd /path/to/my/workingcopy
svn update
svn update
は、リポジトリから最新のリビジョンを取得し、ローカルのファイルと比較して、変更点を適用します。ローカルに変更がある場合は、競合が発生する可能性もありますが、これにより作業コピーはリポジトリの最新状態に追従されます。
--revision
オプションによる特定の時点への戻し/進め
svn update
はデフォルトではリポジトリのHEADリビジョン(最新)を取得しますが、-r
または --revision
オプションを使うことで、特定の過去のリビジョンを作業コピーに反映させることも可能です。
“`bash
作業コピー全体をリビジョン100の状態に戻す
svn update -r 100 /path/to/my/workingcopy
特定のファイルを作業コピーのベースリビジョンからリビジョン100の状態に進める
svn update -r 100 path/to/file.ext
“`
作業コピーが最新リビジョンから大きく乖離してしまい、状態がおかしくなった場合に、一度特定の過去のリビジョンに戻してから再度最新にアップデートする、といった使い方も可能です。これは実質的に、そのリビジョン時点のクリーンな状態を作業コピーに適用する効果を持ちます。
作業コピーの削除と再チェックアウトによる根本的な修復
svn cleanup
や svn update
を試しても作業コピーの状態が修復できない場合、最も確実で根本的な解決策は、その作業コピーを一度完全に削除し、リポジトリから改めてチェックアウトし直すことです。これは前述の「不要な作業コピーを削除する」手順とほぼ同じですが、目的が「不要だから捨てる」のではなく「壊れたから作り直す」である点が異なります。
手順:
1. 修復できない作業コピーのルートディレクトリを特定します。
2. 未コミットの重要な変更がないか確認します。 もし未コミットの変更がある場合、このまま削除すると失われてしまいます。必要な変更であれば、以下のいずれかの方法で退避させます。
* 変更内容を手動でコピーして、作業コピーの外の安全な場所に保存する。
* svn diff > my_changes.patch
コマンドで差分パッチを作成し、保存する。
3. 作業コピーのルートディレクトリを、OSのファイルシステム操作(エクスプローラー、Finder, rm -rf
など)で完全に削除します。
4. 元の作業コピーがあった場所、または別の場所に、svn checkout
コマンドを使ってリポジトリからプロジェクトを改めてチェックアウトします。
bash
svn checkout リポジトリURL [新しい作業コピーのパス]
5. もし手順2でパッチを作成していた場合は、新しくチェックアウトした作業コピーに対してパッチを適用します(patch -p0 < my_changes.patch
など)。手動で保存した変更も、必要に応じてコピーし直します。
この方法は、作業コピーの状態をリポジトリから取得したクリーンな状態に完全にリセットするため、ほとんど全ての作業コピーの問題を解決できます。
これらの方法のメリットとデメリット
svn cleanup
- メリット: 作業コピー自体を削除したり、ネットワーク通信を大量に行ったりすることなく、ローカルで状態を修復できる。高速。
- デメリット: 深刻な問題は解決できない場合がある。未コミット変更には影響しない。
svn update
(-r オプション含む)
- メリット: リポジトリの状態を作業コピーに反映させることで、状態を健全に戻せる。特定のリビジョンに戻すことで、その時点のクリーンな状態を適用できる。
- デメリット: 競合が発生する可能性がある。ネットワーク通信が必要。未コミット変更は保持しようとする(競合の原因にもなる)。
作業コピー削除と再チェックアウト
- メリット: 作業コピーのほぼ全ての問題を根本的に解決できる、最も確実な方法。リポジトリからクリーンな状態を再取得できる。
- デメリット: 未コミット変更が失われるリスクがある(事前の退避が必要)。時間とネットワーク帯域を消費する(特に大規模なプロジェクトの場合)。ローカル固有の設定ファイルなどが失われる可能性がある。
GUIツール(TortoiseSVNなど)での Cleanup および Update 操作方法
TortoiseSVNでは、これらの操作も右クリックメニューから簡単に行えます。
Cleanup:
- クリーンアップしたい作業コピーのディレクトリをエクスプローラーで選択します。作業コピー全体の場合はルートディレクトリ。
- 右クリックします。
- TortoiseSVNのコンテキストメニューから「TortoiseSVN」->「Cleanup…」を選択します。
- Cleanupダイアログが表示されます。通常はデフォルトのオプション(「Clean up working copy status」など)で十分ですが、状況に応じて他のオプション(「Break Locks」など)を選択することもできます。
- 「OK」をクリックします。
Update:
- アップデートしたい作業コピーのディレクトリをエクスプローラーで選択します。作業コピー全体の場合はルートディレクトリ。
- 右クリックします。
- TortoiseSVNのコンテキストメニューから「SVN Update」を選択します。
- 通常はこの操作でリポジトリのHEADリビジョンにアップデートされます。特定のリビジョンにアップデートしたい場合は、「TortoiseSVN」->「Update to Revision…」を選択し、表示されるダイアログでリビジョン番号や日付などを指定します。
作業コピー削除と再チェックアウト(GUI):
- 上記「2. 最も一般的な意図」で説明した方法で、作業コピーディレクトリをエクスプローラーから削除します。
- 新しい作業コピーを作成したい場所で右クリックし、「SVN Checkout…」を選択します。
- リポジトリのURL、チェックアウト先ディレクトリなどを指定して「OK」をクリックします。
結論として、作業コピーの状態をクリーンに戻したり修復したいことが「チェックアウト解除」の意図であれば、まず svn cleanup
を試み、それでも解決しない場合は作業コピーの削除と再チェックアウトを検討するのが一般的な流れです。未コミット変更がある場合は、事前に必ず退避させてください。
5. リポジトリからファイル/ディレクトリを削除する – svn delete
の正確な理解
ユーザーが「チェックアウト解除」という言葉で意図する可能性のあるもう一つのケースは、「特定のファイルやディレクトリを、リポジトリの管理対象から外したい」というものです。これはローカルの作業コピーの状態を変える操作とは異なり、リポジトリそのものに対する変更を加える操作であり、svn delete
コマンドを使用します。しかし、この操作はローカルの「チェックアウト解除」とは目的も結果も大きく異なります。
シナリオ:バージョン管理自体から項目を外したい
プロジェクトを進める中で、特定のファイルやディレクトリが不要になった、あるいは機密情報を含むためバージョン管理下に置くべきではないことが判明したなど、様々な理由で、その項目をリポジトリから完全に削除したい場合があります。このような場合、svn delete
コマンドを使用します。
svn delete
は、指定したファイルやディレクトリをリポジトリの管理から外す操作です。この操作自体はローカルの作業コピーに対して行うこともできますが、その変更をリポジトリに反映させるためには、別途コミットが必要です。
svn delete
コマンドの詳細な解説
svn delete
コマンドには、主に二通りの使い方があります。
- ローカルの作業コピー上で削除操作をマークし、後でコミットする (
svn delete PATH
) - リポジトリ上の項目を直接削除し、即時コミットする (
svn delete URL
)
ローカル作業コピー上での削除 (svn delete PATH
) とコミット
これは、作業コピー上でファイルを編集するのと同じように、削除という変更を記録する最も一般的な方法です。
bash
svn delete PATH...
PATH
: 作業コピー内で削除したいファイルまたはディレクトリのパスを指定します。複数のパスを指定できます。
例:
“`bash
作業コピー内の foo.txt を削除対象としてマーク
svn delete foo.txt
作業コピー内の old_dir/ を削除対象としてマーク
svn delete old_dir/
“`
svn delete PATH
を実行すると、以下のようになります。
- 指定したファイルまたはディレクトリが、作業コピーのファイルシステム上から物理的に削除されます。
- SVNのステータスが
D
(Deleted) とマークされます。svn status
を実行すると、削除対象として表示されます。 - この時点では、リポジトリからはまだ削除されていません。 リポジトリに反映させるためには、この変更を
svn commit
する必要があります。
“`bash
削除マークされた変更をリポジトリにコミット
svn commit -m “Deleted unused foo.txt and old_dir”
“`
コミットが成功すると、そのリビジョン以降のリポジトリから、削除対象となった項目が「削除された状態」として記録されます。これにより、そのリビジョン以降でその項目にアクセスしようとしても見つからなくなります。過去のリビジョンを参照すれば、削除される前の状態を確認したり、復元したりすることも可能です。
リポジトリブラウザからの削除 (svn delete URL
)
リポジトリ上の項目を直接指定して削除し、その変更を即時コミットすることもできます。これは、作業コピーを持っていない場合や、作業コピーを更新せずにリポジトリ上の項目を削除したい場合に便利です。
bash
svn delete URL... -m "コミットメッセージ"
URL
: 削除したいリポジトリ内のファイルまたはディレクトリのURLを指定します。-m "コミットメッセージ"
: コミットメッセージを指定します。これは必須です。
例:
“`bash
リポジトリ上の trunk/foo.txt を削除し、即時コミット
svn delete svn://example.com/repos/myproject/trunk/foo.txt -m “Deleted old foo.txt from trunk”
リポジトリ上の branches/experimental を削除し、即時コミット
svn delete svn://example.com/repos/myproject/branches/experimental -m “Removed experimental branch”
“`
このコマンドは、指定されたURLにある項目をリポジトリから削除し、新しいリビジョンとして記録します。この操作はローカルの作業コピーには直接影響しません。もし作業コピーに削除対象の項目が存在する場合、次に svn update
を実行したときに、作業コピーからその項目が削除されます。
svn delete
が「チェックアウト解除」ではない理由
svn delete
操作は、リポジトリから特定の項目をバージョン管理の履歴の一部として削除するものです。その項目が過去に存在したという事実はリポジトリの履歴に残ります。これは、ローカルの作業コピーとリポジトリとの関連付け(チェックアウトされた状態)そのものを解除する操作とは根本的に異なります。
ユーザーが「チェックアウト解除」と言って svn delete
を意図している場合、それはおそらく「ローカルからファイルを削除したい」と「リポジトリからもそのファイルを消したい」という二つの意図が混ざったものと考えられます。svn delete PATH
-> svn commit
は、まさにその両方を満たす操作です。しかし、これは作業コピーの状態をリセットするのではなく、リポジトリの内容を変更する操作であることを理解しておく必要があります。
削除したファイルをローカルに保持したい場合の特殊な手順
ごく稀に、あるファイルをリポジトリのバージョン管理からは外したいが、ローカルの作業コピーにはそのファイルをバージョン管理外のファイルとして残しておきたい、という場合があります。
この場合の典型的な手順は以下のようになります。
- そのファイルをSVN管理から削除としてマークし、コミットします。
bash
svn delete path/to/file.ext
svn commit -m "Removed file.ext from version control"
このコミットにより、リポジトリの新しいリビジョンからはこのファイルが削除されます。また、あなたの作業コピーからもファイルが物理的に削除されます。 - コミットが成功した後、作業コピー内でそのファイルをバージョン管理外のファイルとして改めて作成し直します。
bash
# 削除されたファイルがまだごみ箱などに残っていればそこから戻すか、
# 元の内容をどこか別の場所に保存しておいたものをコピーし直す
# あるいは全く新しい内容でファイルを作成する
cp /path/to/saved/file.ext path/to/file.ext - この新しく作成されたファイルは、
svn status
を実行すると?
(Unversioned) ステータスとして表示されます。 - 以降、このファイルはSVNによってバージョン管理されませんが、ローカルの作業コピーには存在し続けます。他のユーザーがリポジトリを最新にアップデートすると、彼らの作業コピーからはこのファイルが削除されますが、彼らが手動でファイルを作成し直さない限り、そのファイルは表示されません。プロジェクトメンバー間でこのファイルの扱いついて認識を共有しておく必要があります。
- 必要であれば、このファイルを作業コピーのルートディレクトリにある
.svnignore
ファイル(またはグローバル設定)に追加し、svn status
で?
と表示されないようにしておくと便利です。
これはやや特殊なケースであり、「チェックアウト解除」の一般的な意図とは異なりますが、特定の項目をバージョン管理から外すという文脈で関連するため説明しました。
svn:ignore
プロパティとの違い
ここで、よく混同されるかもしれない svn:ignore
プロパティについて触れておきます。svn:ignore
は、SVNにまだ追加されていないファイルやディレクトリを、svn status
や svn add
のデフォルト動作から無視させるためのプロパティです。例えば、コンパイルによって生成される実行ファイルやオブジェクトファイル、ログファイル、IDEの設定ファイルなど、バージョン管理に含める必要のない一時的なファイルを作業コピー内に置いておきたい場合に利用します。
svn:ignore
は、既にバージョン管理されている項目を管理から外す機能ではありません。既にバージョン管理されている項目を外したい場合は、上記で説明した svn delete
を使用する必要があります。
GUIツール(TortoiseSVNなど)での Delete 操作方法
TortoiseSVNでは、ローカル作業コピー上での svn delete
操作は簡単です。
- 作業コピー内で削除したいファイルまたはディレクトリをエクスプローラーで選択します。
- 右クリックします。
- TortoiseSVNのコンテキストメニューから「TortoiseSVN」->「Delete」を選択します。
- 確認ダイアログが表示されるので、「OK」をクリックします。
これにより、選択した項目は作業コピーから物理的に削除され、D
ステータスとしてマークされます。次に svn commit
を実行すると、この削除がリポジトリに反映されます。
リポジトリブラウザから直接削除したい場合は、TortoiseSVNの「Repo-Browser」機能を使います。
- エクスプローラーで作業コピーのディレクトリを右クリックし、「TortoiseSVN」->「Repo-Browser」を選択します。
- リポジトリブラウザが開いたら、削除したいファイルまたはディレクトリを探します。
- その項目を右クリックし、「Delete」を選択します。
- コミットメッセージを入力するダイアログが表示されるので、メッセージを入力して「OK」をクリックします。
これにより、リポジトリから項目が即時削除されます。
結論として、リポジトリから項目をバージョン管理外にしたいことが「チェックアウト解除」の意図であれば、svn delete
コマンド(またはGUIツールでの Delete 機能)を使用するのが適切な方法です。これはローカル作業コピーのリセットではなく、リポジトリに対する変更操作です。
6. その他の関連操作 – svn unlock
など
「チェックアウト解除」という言葉の背後には、特定のSVN操作に関連した問題解決の意図が隠されていることもあります。その一つがロックの解除です。
svn unlock
:ロックの解除
SVNには、特定のファイルやディレクトリを他のユーザーがコミットできないように「ロック」する機能があります。これは、バイナリファイルなど、マージが困難なファイルを複数ユーザーが同時に編集することによる競合を防ぐために使用されることがあります。
ロックされたファイルは、他のユーザーはそのファイルを編集・コミットすることができなくなります。ローカルの作業コピーでロックをかけた場合も、意図せずロックがかかったままになってしまうことがあります。このような状況で、「このロック状態を解除したい」という意図を「チェックアウト解除」と表現するユーザーもいるかもしれません。
ロックとは何か、なぜ必要か
SVNのロックは、排他制御の一種です。あるユーザーがファイルXにロックをかけると、そのユーザーがロックを解除するか、管理者がロックを強制解除するまで、他のユーザーはファイルXの変更をコミットできなくなります。これは、テキストファイルのようにマージ可能なファイルには通常使用されず、画像ファイルやCADデータなどのバイナリファイルに使われることが多いです。
ロック操作は svn lock
コマンドで行います。
bash
svn lock TARGET... -m "ロックの理由"
ロックされたファイルは、svn status
コマンドの出力に K
(Locked) ステータスとして表示されることがあります。
svn unlock
の使い方と --force
オプション
ロックを解除するには、svn unlock
コマンドを使用します。
bash
svn unlock TARGET...
TARGET
: ロックを解除したいファイルまたはディレクトリのパス(作業コピー内)またはURL(リポジトリ内)を指定します。
例:
“`bash
作業コピー内の foo.png のロックを解除
svn unlock foo.png
リポジトリ上の bar.docx のロックを解除(作業コピーを持っていない場合など)
svn unlock svn://example.com/repos/myproject/trunk/bar.docx
“`
通常、ロックをかけたユーザー本人だけが svn unlock
でロックを解除できます。しかし、ロックをかけたユーザーが作業できなくなった場合など、管理者などが強制的にロックを解除する必要がある場合があります。その場合は --force
オプションを使用します。
“`bash
強制的にロックを解除(管理者権限などが必要な場合がある)
svn unlock –force TARGET…
“`
svn unlock
コマンドは、作業コピーの状態をリセットする「チェックアウト解除」とは全く異なる、特定のファイルに対する排他制御の状態を変更する操作です。もしロックが原因でSVN操作がうまくいかない場合に「チェックアウト解除」を試みようとしていたのであれば、svn cleanup
(残存ロックを解除)または svn unlock
(明示的なロックを解除)が適切なコマンドとなります。
svn switch
:作業コピーを別のブランチ/タグに切り替える
もう一つ、作業コピーの状態を大きく変更する操作として svn switch
があります。これは、作業コピーの対象URLを、同じリポジトリ内の別の場所(例えば、開発中の trunk
から安定版の branches/release_1.0
へ、あるいは特定の tags/v1.0.0
へ)に切り替える操作です。
bash
svn switch NEW_URL [PATH]
NEW_URL
: 切り替えたいリポジトリ内の新しいURLを指定します。[PATH]
: 切り替えたい作業コピーのルートディレクトリを指定します。省略した場合は現在のディレクトリが対象となります。
svn switch
を実行すると、SVNは現在の作業コピーの内容と新しいURLのディレクトリの内容を比較し、差分を作業コピーに適用します。これにより、作業コピーは新しいURLに対応する状態に変化します。
これも「チェックアウト解除」とは異なりますが、「作業中の状態を全く別の状態に切り替えたい」という意図で、誤って「チェックアウト解除」という言葉が使われることがあるかもしれません。この場合は svn switch
が正しい操作です。
7. まとめと推奨プラクティス
この記事では、ユーザーが「チェックアウト解除」という言葉で意図する可能性のある複数のシナリオと、それに対応するSVNの正しい操作方法を詳細に解説しました。ここで、その内容を改めて整理し、推奨プラクティスをまとめます。
「チェックアウト解除」という言葉の不正確さの再確認
まず最も重要な点は、SVNに「チェックアウト解除」という単一のコマンドや明確な概念は存在しないということです。この言葉は、SVNの作業コピーの状態をリセットしたい、あるいは不要になった管理下の要素を取り除きたい、といった様々な意図を曖昧に表現するために使われています。
ユーザーの意図に応じた適切なコマンドの選択リスト
「チェックアウト解除」という言葉の背後にある意図によって、取るべき操作は全く異なります。以下に、主要な意図とそれに対応する操作(コマンドまたは手順)のリストをまとめます。
ユーザーの意図 | 適切な操作(コマンド/手順) | 説明 |
---|---|---|
不要になったローカル作業コピーを完全に削除したい | 作業コピーのルートディレクトリを物理的に削除 (ファイルシステム操作) | 最も一般的な意図。.svn ディレクトリを含めて丸ごと削除する。未コミット変更は失われるため要注意。 |
ローカルの未コミット変更を破棄したい | svn revert [TARGET...] (特に -R . で作業コピー全体) |
作業コピー内の編集、追加、削除、衝突などのローカル変更を破棄し、ベースリビジョンの状態に戻す。? ファイルは対象外。変更は不可逆。 |
作業コピーがロックされたなど、状態をクリーンにしたい | svn cleanup [PATH] |
作業コピー内のロック解除や中断操作の後始末などを行う。軽微な不整合を修復する。 |
作業コピーが深刻に壊れた、または古くなりすぎた | 作業コピーを物理的に削除 -> svn checkout で再取得 |
最も確実な修復方法。未コミット変更は事前に退避が必要。時間とネットワーク帯域を消費する。 |
リポジトリから特定のファイル/ディレクトリを削除したい | svn delete PATH + svn commit または svn delete URL -m "..." |
リポジトリの履歴から項目を「削除された状態」として記録する。ローカルの作業コピーのリセットではない。svn:ignore とは異なる。 |
ロック状態を明示的に解除したい | svn unlock TARGET ( --force オプションで強制解除) |
特定のファイルやディレクトリにかかったロック状態を解除する。 |
作業コピーの対象ブランチ/タグを切り替えたい | svn switch NEW_URL [PATH] |
作業コピーの内容を、同じリポジトリ内の別のURLの状態に変化させる。 |
操作前には必ず svn status
で状態確認する習慣を
SVN作業を行う上で最も基本的で重要な習慣の一つは、何か変更を加えたり、重要な操作(特に削除や Revert)を行う前に、必ず svn status
コマンドを作業コピーのルートディレクトリで実行し、現在の作業コピーの状態を確認することです。
bash
svn status
このコマンドによって、どのファイルが変更されたか (M
)、新規に追加されたか (A
)、削除されたか (D
)、衝突しているか (C
)、バージョン管理外であるか (?
) など、現在の作業コピーがリポジトリのベース状態からどのように変化しているかを正確に把握できます。
状態を確認することで、意図しない変更を破棄してしまったり、必要なファイルを誤って削除してしまったりするリスクを大幅に減らすことができます。
重要な操作前の慎重な確認とバックアップ
特に svn revert
や作業コピーの物理的な削除など、ローカルの変更を破棄する可能性のある操作を行う前には、改めて操作対象の範囲を確認し、失われて困る変更がないか慎重に検討してください。
もし未コミットの変更が残っており、それを将来使う可能性がある場合は、操作を実行する前にその変更を別の場所にバックアップ(ファイルをコピーする、パッチを作成するなど)しておくことを強く推奨します。
GUIツールの活用推奨
TortoiseSVNなどのGUIツールは、SVNのコマンドライン操作に比べて、現在の作業コピーの状態を視覚的に把握しやすく、また各操作をメニューから直感的に実行できます。特に初心者の方や、コマンドライン操作に不慣れな方には、GUIツールの活用をおすすめします。svn status
の結果はアイコンオーバーレイで表示され、Revert や Cleanup といった操作も右クリックメニューから項目を選択するだけで実行できます。
8. 付録:GUIツール (TortoiseSVN) での操作早見表
Windowsユーザーに人気の高いTortoiseSVNでの主要な操作の早見表を掲載します。
意図/操作 | コマンドライン相当 | TortoiseSVNでの操作 |
---|---|---|
チェックアウト (作業コピー作成) | svn checkout URL [PATH] |
新規ディレクトリで右クリック -> TortoiseSVN -> SVN Checkout… |
不要な作業コピーの物理的削除 | rm -rf /path/... |
エクスプローラーでディレクトリを選択 -> 右クリック -> 削除 |
未コミット変更の破棄 (Revert) | svn revert [TARGET] |
ファイル/ディレクトリを選択 -> 右クリック -> TortoiseSVN -> Revert… -> ダイアログで対象を選択 -> OK |
作業コピーのクリーンアップ | svn cleanup [PATH] |
作業コピーのディレクトリを選択 -> 右クリック -> TortoiseSVN -> Cleanup… -> ダイアログでオプションを選択 -> OK |
リポジトリからの項目削除 (Delete) | svn delete PATH + commit |
作業コピー内のファイル/ディレクトリを選択 -> 右クリック -> TortoiseSVN -> Delete -> 確認OK -> コミット |
リポジトリからURL指定で即時削除 | svn delete URL -m "..." |
エクスプローラーで作業コピーを選択 -> 右クリック -> TortoiseSVN -> Repo-Browser -> リポジトリブラウザで対象を選択 -> 右クリック -> Delete |
ロックの解除 | svn unlock TARGET |
ファイル/ディレクトリを選択 -> 右クリック -> TortoiseSVN -> Get & Commit… -> Locked Filesタブ -> Unblock |
別のブランチ/タグへの切り替え (Switch) | svn switch NEW_URL [PATH] |
作業コピーのディレクトリを選択 -> 右クリック -> TortoiseSVN -> Switch… -> 切り替え先URLを指定 -> OK |
状態確認 | svn status |
エクスプローラーのアイコンオーバーレイを確認 ファイル/ディレクトリを選択 -> 右クリック -> TortoiseSVN -> Check for modifications |
リポジトリへの変更送信 (Commit) | svn commit -m "..." |
作業コピーのディレクトリを選択 -> 右クリック -> SVN Commit… -> ダイアログで対象を選択/メッセージ入力 -> OK |
リポジトリの最新を取得 (Update) | svn update [PATH] |
作業コピーのディレクトリを選択 -> 右クリック -> SVN Update |
特定リビジョンへのアップデート | svn update -r REV [PATH] |
作業コピーのディレクトリを選択 -> 右クリック -> TortoiseSVN -> Update to Revision… -> ダイアログでリビジョン指定 -> OK |
結論
SVNにおける「チェックアウト解除」という言葉は、ユーザーが作業コピーに関連して何らかの状態のリセットや終了を意図しているものの、その具体的な操作やコマンド名を知らない場合に用いられる曖昧な表現です。SVNにはその名のコマンドは存在せず、ユーザーの真の意図に応じて、作業コピーの物理的な削除、svn revert
によるローカル変更の破棄、svn cleanup
や再チェックアウトによる作業コピーの修復、あるいはsvn delete
によるリポジトリからの項目削除など、様々な異なる操作を使い分ける必要があります。
どの操作を行うにしても、事前に svn status
で作業コピーの状態を確認し、未コミットの重要な変更がないかを把握することが極めて重要です。特に変更を破棄する操作(物理削除、svn revert
)は不可逆であるため、慎重な確認と、必要に応じたバックアップを心がけましょう。
この記事が、「チェックアウト解除」という言葉にまつわる混乱を解消し、SVN作業コピーをより適切に管理するための一助となれば幸いです。