はい、承知いたしました。Subversion (SVN) の svn st コマンドの結果に表示される各シンボルの意味を詳細に解説する記事を約5000語で記述し、ここに直接表示します。
svn st コマンド徹底解剖:表示される全てのシンボルの意味を理解する
バージョン管理システムは、ソフトウェア開発だけでなく、ドキュメント作成や設定ファイル管理など、様々な場面でその真価を発揮します。変更履歴を記録し、いつでも過去の状態に戻したり、複数の開発者と協力して作業を進めたりすることを可能にするバージョン管理システムの中でも、Subversion(以下、SVN)は長く広く利用されてきたシステムのひとつです。
SVNを利用する上で、最も頻繁に、そして最も重要視されるコマンドの一つが svn status、またはその短縮形である svn st です。このコマンドは、現在作業しているローカルのコピー(作業コピー)が、最後にリポジトリと同期した状態からどのように変化しているかを示してくれます。つまり、「今、自分の手元のファイルやディレクトリがどんな状況にあるのか?」 を一目で把握するための必須ツールなのです。
しかし、svn st の出力結果には、ファイルのパスの前に様々なアルファベットや記号が1文字ないし複数文字表示されます。これらの記号は、ファイルの追加、変更、削除といった基本的な状態だけでなく、競合、無視、ロック、外部定義など、様々な複雑な状況を表現しています。これらのシンボルの意味を正確に理解していなければ、作業コピーの状態を誤解し、予期しない問題を引き起こす可能性があります。
この記事では、svn st コマンドの基本的な使い方から始め、出力結果に表示される全ての主要なシンボルについて、その意味、原因、表示される状況、そしてその状態から次に取るべきアクションなどを、具体的な例を交えながら徹底的に解説します。この記事を読むことで、あなたは svn st の出力を完全に理解し、自信を持ってSVNでの作業を進めることができるようになるでしょう。
1. なぜ svn st コマンドが重要なのか?
ソフトウェア開発や共同作業において、バージョン管理は不可欠です。複数の人が同時に同じプロジェクトの異なる部分を編集したり、変更を加えたりする際に、変更が失われたり、互いの作業が干渉したりするのを防ぎ、効率的に作業を進めるためにバージョン管理システムが存在します。
SVNのような集中型バージョン管理システムでは、中央リポジトリに変更履歴が蓄積され、各開発者はそのリポジトリからプロジェクトのコピー(作業コピー)を取得して作業を行います。作業コピーはリポジトリの特定のリビジョンに基づいた状態ですが、開発者がファイルを編集したり、新しくファイルを作成したり、不要なファイルを削除したりすることで、作業コピーの状態はリポジトリの状態から乖離していきます。
svn st コマンドは、この作業コピーとリポジトリ(または作業コピーのベースとなっているリビジョン)との間の状態の違いを報告します。具体的には、以下の情報を教えてくれます。
- どのファイルが新規に追加されたが、まだリポジトリにコミットされていないか。
- どのファイルが変更されたか。
- どのファイルが削除されたか。
- どのファイルがバージョン管理下にないか。
- 複数の変更が衝突し、手動での解決が必要なファイルはどれか。
- プロパティが変更されたファイルやディレクトリはどれか。
- 特定のファイルがロックされているか。
- リポジトリと比較して、作業コピーが最新の状態にあるか(オプション指定時)。
これらの情報を把握せずにコミットやアップデートを行うと、意図しないファイルがコミットされたり、重要な変更が失われたり、深刻な競合が発生したりする可能性があります。したがって、コミットやアップデートなどの重要な操作を行う前には、必ず svn st を実行して現在の作業コピーの状態を確認する習慣をつけることが、SVNを安全かつ効率的に利用するための基本となります。
2. svn st コマンドの基本的な使い方と出力フォーマット
svn st コマンドは非常にシンプルです。基本的な使い方は以下の通りです。
“`bash
svn status [PATH…]
または
svn st [PATH…]
“`
PATHを指定しない場合: カレントディレクトリ以下の全てのバージョン管理下アイテム(およびバージョン管理外アイテムの一部)の状態が表示されます。PATHを指定した場合: 指定したファイルまたはディレクトリとその内容の状態が表示されます。
例:
* svn st: カレントディレクトリ以下の全アイテムの状態を表示。
* svn st README.txt: README.txt の状態を表示。
* svn st src/: src ディレクトリとその内容の状態を表示。
出力フォーマットの概要
svn st の出力は、通常、以下のようなフォーマットになっています。
状態シンボル アイテムのパス
より詳細な情報を表示するオプション(後述する -v や --show-updates など)を使用しない場合、出力は基本的にこの形式です。しかし、実はこの「状態シンボル」の部分には、複数の情報を伝えるための複数のカラムが存在します。
Subversionの公式ドキュメントによると、svn st のデフォルトの出力では、ファイル/ディレクトリのパスの前に最大で6つのカラムにシンボルが表示されます。それぞれのカラムが異なる種類の状態を示しています。
-
カラム1: ファイル/ディレクトリのアイテムの状態
- 最も重要なカラムで、アイテム自身が追加、変更、削除されているかなどの状態を示します。
- 表示されるシンボル:
A,C,D,I,M,R,?,!,~,X,L
-
カラム2: プロパティの状態
- アイテムのプロパティ(
svn:ignore,svn:executable,svn:keywordsなど)が変更されているか競合しているかを示します。 - 表示されるシンボル:
M,C
- アイテムのプロパティ(
-
カラム3: コピー/移動の履歴
- そのアイテムが
svn copyまたはsvn moveによって作成され、履歴情報を持っていることを示します。 - 表示されるシンボル:
+
- そのアイテムが
-
カラム4: ロックの状態
- アイテムがロックされているか、そのロックに関する情報を示します。
- 表示されるシンボル:
K,O,T,B
-
カラム5: スイッチングの状態
- 作業コピーのアイテムが、親ディレクトリとは異なるリポジトリパス(別のブランチやタグ)にスイッチされていることを示します。
- 表示されるシンボル:
S
-
カラム6: 外部定義の状態
- このカラムは、
--depth externalsオプションを指定した場合に、svn:externalsプロパティで定義された外部リポジトリの状態を示します。通常は表示されません。 - 表示されるシンボル:
X
- このカラムは、
これらのカラムのいずれにも該当する状態がない場合、そのカラムは空白で表示されます。
例:
* M my_file.txt: my_file.txt はアイテムとして変更されている(カラム1が M、他は空白)。
* MM my_file.txt: my_file.txt はアイテムとしてもプロパティとしても変更されている(カラム1が M、カラム2が M、他は空白)。
* A + new_file.txt: new_file.txt は追加予定であり、かつ履歴を持っている(svn copy または svn move による)(カラム1が A、カラム3が +、他は空白)。
デフォルトでは、状態を示すシンボルが表示されるカラム以外は空白で表示されるため、一見すると1つのシンボルが表示されているように見えますが、実際には複数の情報の組み合わせである可能性があることを理解しておくことが重要です。
次のセクションでは、これらの各カラムに表示されるシンボルについて、一つずつ詳細に解説していきます。
3. 各シンボルの詳細な解説
3.1. カラム1: ファイル/ディレクトリのアイテムの状態
このカラムは最も頻繁に表示され、作業コピー内のアイテム(ファイルまたはディレクトリ)そのものの状態を示します。
A: Added (追加)
- 意味: このアイテムは新しく作成され、
svn addコマンドによってバージョン管理に追加される予定になっています。まだリポジトリには存在せず、次のコミットで初めてリポジトリに追加されます。 - 原因/表示される操作:
svn add <ファイル名/ディレクトリ名>コマンドを実行した場合。svn copyまたはsvn moveコマンドで、新しいパスとして作成された場合(この場合、カラム3に+も表示されます)。
- 確認方法:
svn status -v: 追加されたアイテムのベースリビジョン(まだない場合は-)や、リポジトリでのパスなどが表示されます。svn diff <ファイル名>: 追加されたファイルの内容全体が新しい内容として表示されます。
- 次のステップ/解決方法:
- 追加内容をリポジトリに反映するには、
svn commit <ファイル名/ディレクトリ名>を実行します。 - 追加を取り消す場合は、
svn revert <ファイル名/ディレクトリ名>を実行します。これにより、ローカルのファイルも削除されます。
- 追加内容をリポジトリに反映するには、
- 注意点: ファイルを作成しただけでは
Aにはなりません。必ずsvn addを実行する必要があります。 - 具体例:
new_feature.txtというファイルを新しく作成します。
bash
touch new_feature.txt- この時点では
svn stは?を表示します。
bash
$ svn st
? new_feature.txt svn addを実行します。
bash
svn add new_feature.txt- 再度
svn stを実行します。
bash
$ svn st
A new_feature.txt
これで、new_feature.txtは次のコミットでリポジトリに追加される予定になったことがわかります。
C: Conflicted (競合)
- 意味: このアイテムは、
svn updateまたはsvn mergeコマンドの実行中に、ローカルでの変更とリポジトリ(またはマージ元)での変更が同じ箇所に対して行われ、Subversionが自動的に変更を統合できなかった状態です。手動での競合解決が必要です。 - 原因/表示される操作:
- ローカルでファイルを変更し、かつ、他の人が同じファイルの同じ箇所を変更して先にコミットした場合、その後に
svn updateを実行すると競合が発生します。 - 特定のファイルやディレクトリに対して
svn mergeを実行した際に、ローカルでの変更とマージ元の変更が衝突した場合。
- ローカルでファイルを変更し、かつ、他の人が同じファイルの同じ箇所を変更して先にコミットした場合、その後に
- 確認方法:
svn status <ファイル名>:Cシンボルが表示されていることを確認します。- 競合が発生したファイルには、Subversionによって競合マーカー(
<<<<<<<,=======,>>>>>>>など)が挿入され、元のファイル、自分の変更、相手の変更を示す一時ファイル(例:.mine,.rOLDREV,.rNEWREV)も作成されます。これらのファイルを確認して競合箇所を特定します。
- 次のステップ/解決方法:
- 競合しているファイルをテキストエディタなどで開き、競合マーカーを参考に手動で変更を統合します。どのバージョンの変更を採用するか、あるいは新しい内容を作成するかを判断します。
- 変更の統合が完了したら、競合マーカーや一時ファイルを全て削除します。
- 競合が解決したことをSubversionに知らせるために、
svn resolved <ファイル名>コマンドを実行します。これにより、一時ファイルが削除され、svn stの表示がCからM(Modified) に変わります。 - 解決済みの変更を
svn commit <ファイル名>でリポジトリにコミットします。
- 注意点:
svn resolvedはあくまで「手動での変更統合が終わった」ことをSubversionに伝えるだけであり、ファイルの内容が本当に正しく統合されたかどうかはSubversionはチェックしません。手動統合の際に誤りがないよう細心の注意が必要です。また、ディレクトリに対してCが表示されることもありますが、これはそのディレクトリ内のアイテムやプロパティに競合があることを示唆しています。 - 具体例:
config.iniをローカルで編集します。- 他の人が同じ
config.iniの同じ箇所を編集し、先にコミットします。 - 自分が
svn updateを実行します。競合が発生します。
bash
$ svn update
Updating '.':
C config.ini
Updated to revision 10.
Summary of conflicts:
Text conflicts: 1 svn stを実行します。
bash
$ svn st
C config.ini
config.iniの前にCが表示され、競合していることがわかります。手動でファイルを編集し、svn resolved config.iniを実行して解決する必要があります。
D: Deleted (削除)
- 意味: このアイテムは
svn deleteコマンドによってバージョン管理から削除される予定になっています。次のコミットでリポジトリからも削除されます。または、ローカルでファイルが削除されたが、まだSubversionにその旨が伝えられていない(バージョン管理外として認識されている)状態を示す場合もあります(この場合は!シンボルが表示されることが多いですが、状況によりDの表示になることもあります)。通常はsvn delete実行後の状態を指します。 - 原因/表示される操作:
svn delete <ファイル名/ディレクトリ名>コマンドを実行した場合。
- 確認方法:
svn status -v: 削除予定のアイテムのベースリビジョンなどが表示されます。
- 次のステップ/解決方法:
- 削除をリポジトリに反映するには、
svn commit <ファイル名/ディレクトリ名>を実行します。 - 削除を取り消す場合は、
svn revert <ファイル名/ディレクトリ名>を実行します。これにより、リポジトリの最新リビジョンの内容でファイルが復元されます。
- 削除をリポジトリに反映するには、
- 注意点: ローカルでファイルをゴミ箱に捨てたり
rmコマンドで削除したりしただけでは、通常!(Missing) と表示されます。バージョン管理システムに削除を伝えるには必ずsvn deleteを使用する必要があります。 - 具体例:
- 不要になった
old_script.shを削除します。
bash
svn delete old_script.sh svn stを実行します。
bash
$ svn st
D old_script.sh
old_script.shの前にDが表示され、次のコミットで削除される予定になったことがわかります。
- 不要になった
I: Ignored (無視)
- 意味: このアイテムは、作業コピー内に存在するが、Subversionによるバージョン管理から意図的に無視されている状態です。通常、一時ファイル、ビルド生成物、ログファイルなど、バージョン管理する必要のないファイルやディレクトリに対して設定されます。
- 原因/表示される操作:
- 親ディレクトリに
svn:ignoreプロパティが設定されており、その設定に一致するファイルまたはディレクトリが作業コピーに存在する場合。 - グローバルな無視リストが設定されている場合。
- 親ディレクトリに
- 確認方法:
svn stを実行すると、デフォルトでは無視されたアイテムは表示されません。- 無視されているアイテムも含めて表示するには、
svn status --no-ignoreオプションを使用します。このオプションを指定したときにのみ、無視されているアイテムの前にIシンボルが表示されます。
- 次のステップ/解決方法:
Iと表示されるアイテムは、意図的に無視されているものなので、通常は特別なアクションは不要です。- もし、本来バージョン管理すべきファイルが
Iと表示されてしまう場合は、親ディレクトリのsvn:ignoreプロパティの設定を確認し、必要に応じて修正します(svn propget svn:ignore <ディレクトリ名>、svn propset svn:ignore <ディレクトリ名>)。
- 注意点:
svn stのデフォルト出力には表示されないため、新規に作成したファイルなどが?として表示されない場合、無視設定にかかっている可能性があります。その場合は--no-ignoreオプションで確認する必要があります。 - 具体例:
temp/ディレクトリと、その中にtemp.logファイルを作成します。
bash
mkdir temp
touch temp/temp.log- デフォルトの
svn stでは何も表示されないかもしれません。
bash
$ svn st
? temp/
(ここではtemp/ディレクトリ自体はバージョン管理外として表示される) - 親ディレクトリ(ここではカレントディレクトリ)に
svn:ignoreプロパティを設定し、temp.logを無視するようにします。
bash
svn propset svn:ignore "*.log" .
# プロパティ変更はMと表示される
$ svn st
M .
? temp/ - 設定したプロパティ変更をコミットします。
bash
svn commit -m "Added ignore for *.log" .
# コミット後、プロパティ変更Mが消える
$ svn st
? temp/ - ここで
temp/temp.logは無視されるべきファイルです。--no-ignoreオプション付きでsvn stを実行します。
bash
$ svn st --no-ignore
? temp/
I temp/temp.log
temp/temp.logがIと表示され、無視されていることがわかります。
M: Modified (変更)
- 意味: このアイテムは、作業コピー内の内容が、そのアイテムのベースリビジョンから変更されています。ファイルの場合は内容の変更、ディレクトリの場合はその直下のアイテムの構成(追加、削除、名前変更など)の変更を意味します。プロパティのみが変更されている場合は、通常カラム2に
Mが表示されます。 - 原因/表示される操作:
- ファイルを編集し、保存した場合。
- ディレクトリ内で
svn add、svn delete、svn copy、svn moveなどの操作を行った場合(これらの操作自体はA,D,+などのシンボルを表示しますが、親ディレクトリも同時にMと表示されることがあります)。 svn propset,svn propdel,svn propeditなどでプロパティを変更した場合(この場合、カラム2にもMが表示されMMとなります)。
- 確認方法:
svn diff <ファイル名/ディレクトリ名>: 変更内容の詳細を差分形式で確認できます。svn status -v: 変更されたアイテムのベースリビジョンなどが表示されます。
- 次のステップ/解決方法:
- 変更内容をリポジトリに反映するには、
svn commit <ファイル名/ディレクトリ名>を実行します。 - 変更を取り消す場合は、
svn revert <ファイル名/ディレクトリ名>を実行します。これにより、作業コピーの内容がベースリビジョンの状態に戻ります。 --show-updatesオプションと組み合わせてsvn st -uを実行した場合、同時にリポジトリでの変更(*やリモートM)も確認できます。もしリポジトリでも同じファイルが変更されている場合は、コミットする前にsvn updateを実行して競合が発生しないか確認するか、競合を解決する必要があります。
- 変更内容をリポジトリに反映するには、
- 注意点: ディレクトリに対する
Mは、そのディレクトリ自身の内容変更ではなく、直下の子要素の状態変更を反映していることが多いです。 - 具体例:
README.txtというファイルを編集します。
bash
echo "新しい情報を追加しました。" >> README.txtsvn stを実行します。
bash
$ svn st
M README.txt
README.txtの前にMが表示され、内容が変更されたことがわかります。
R: Replaced (置換)
- 意味: このアイテムは、一旦
svn deleteされた後、同じ名前で新しいアイテムがsvn addされた状態、あるいはsvn moveまたはsvn copyコマンドで既存のアイテムを上書きするように移動/コピーされた状態です。実際には、リポジトリから削除された後に新しいアイテムとして追加される予定になっていますが、履歴は引き継がれます(svn copyやsvn moveの場合)。 - 原因/表示される操作:
- 既存のバージョン管理下ファイルを
svn deleteで削除し、その後同じ名前で新しいファイルを作成してsvn addを実行した場合。 svn move <既存パス> <新しいパス>で、新しいパスにすでにバージョン管理下アイテムが存在しており、それを上書きした場合。svn copy <既存パス> <新しいパス>で、新しいパスにすでにバージョン管理下アイテムが存在しており、それを上書きした場合。
- 既存のバージョン管理下ファイルを
- 確認方法:
svn status -v: 置換されたアイテムの元の情報と新しい情報の一部が表示されます。svn diff <ファイル名>: 置換されたアイテムの変更内容(新しい内容全体)が表示されます。
- 次のステップ/解決方法:
- 置換内容をリポジトリに反映するには、
svn commit <ファイル名/ディレクトリ名>を実行します。 - 置換を取り消す場合は、
svn revert <ファイル名/ディレクトリ名>を実行します。これにより、削除前の元のアイテムが復元されます。
- 置換内容をリポジトリに反映するには、
- 注意点:
Rは比較的珍しい状態です。通常はsvn deleteしてからsvn addするよりも、単にファイルを編集する (M) か、svn copy/svn moveを使う方がシンプルです。R状態のアイテムを再度変更した場合も、MRのように表示されることがあります(カラム1: M, カラム2以降: R, ただしSVNのバージョンや具体的な操作による)。 - 具体例:
main.cというファイルをsvn deleteします。
bash
svn delete main.csvn stはDを表示します。
bash
$ svn st
D main.c- 新しい
main.cファイルを作成し、svn addします。
bash
echo "// 新しいメインファイル" > main.c
svn add main.c svn stを実行します。
bash
$ svn st
R main.c
main.cがRと表示され、置換予定になったことがわかります。
?: Unversioned (バージョン管理外)
- 意味: このアイテムは作業コピー内に存在するが、Subversionによるバージョン管理下に置かれていない状態です。つまり、Subversionは存在を認識しているものの、追跡すべき対象として扱っていません。
- 原因/表示される操作:
mkdirやtouch、コピー&ペーストなどで、OSのコマンドやファイルマネージャーを使って新しくファイルやディレクトリを作成した場合。- ビルドツールなどが一時的に生成したファイルやディレクトリ。
- 確認方法:
svn statusのデフォルト出力に表示されます。
- 次のステップ/解決方法:
- もしこのアイテムをバージョン管理下に置きたい場合は、
svn add <ファイル名/ディレクトリ名>コマンドを実行します。これにより、状態が?からAに変わります。 - もしこのアイテムをバージョン管理下に置く必要がなく、かつ
svn stの出力に表示させたくない場合は、親ディレクトリのsvn:ignoreプロパティを設定するか、グローバルな無視リストに登録します。これにより、状態が?からIに変わり、デフォルトのsvn st出力からは消えます。 - 一時ファイルなどで、単に表示を消したいだけであれば、削除しても構いません (
rm <ファイル名/ディレクトリ名>)。
- もしこのアイテムをバージョン管理下に置きたい場合は、
- 注意点: 新しくファイルを作成したら、バージョン管理する必要があるかどうかを判断し、必要なら
svn addする必要があります。不要なファイルが?と表示されている場合は、無視設定を検討しましょう。 - 具体例:
test_results.txtというファイルを新しく作成します。
bash
touch test_results.txtsvn stを実行します。
bash
$ svn st
? test_results.txt
test_results.txtの前に?が表示され、バージョン管理外であることがわかります。
!: Missing, incomplete (見つからない、不完全)
- 意味: このアイテムはバージョン管理下にあるはずなのに、作業コピー内の期待される場所に存在しない状態です。ファイルがOSのコマンド(
rmなど)で誤って削除された場合や、作業コピーが不完全な状態にある場合に発生します。 - 原因/表示される操作:
- バージョン管理下のファイルをOSのコマンド(
rmなど)で削除した場合。 - 以前に
svn updateやsvn checkoutが中断され、作業コピーが不完全な状態になった場合。 - 他のユーザーがリポジトリから削除したファイルを、自分がローカルで持っている状態で
svn updateを行った場合(この場合はDと表示されることも多いです)。
- バージョン管理下のファイルをOSのコマンド(
- 確認方法:
svn statusのデフォルト出力に表示されます。- ファイルの場所を確認しても、ファイルが存在しないことを確認できます。
- 次のステップ/解決方法:
- 意図せず削除してしまった場合は、
svn update <ファイル名/ディレクトリ名>またはsvn revert <ファイル名/ディレクトリ名>を実行してリポジトリからファイルを復元します。 - もしそのアイテムを意図的に削除したい場合は、
svn delete <ファイル名/ディレクトリ名>コマンドを(対象ファイルが存在しない状態でも)実行することで、削除予定の状態(D)に変更できます。その後コミットすればリポジトリからも削除されます。 - 作業コピー全体が不完全な場合は、まず
svn cleanupを実行し、その後svn updateを試みます。
- 意図せず削除してしまった場合は、
- 注意点:
!は作業コピーの状態が異常であることを示すサインです。放置すると後々問題になる可能性があるため、表示されたら速やかに対処すべきです。意図しないrmなどによる削除が原因であることが多いです。 - 具体例:
- バージョン管理下のファイル
data.jsonをOSコマンドで削除します。
bash
rm data.json svn stを実行します。
bash
$ svn st
! data.json
data.jsonの前に!が表示され、本来あるべきファイルが見つからない状態であることがわかります。
- バージョン管理下のファイル
~: Obstructed (妨害)
- 意味: このアイテムはバージョン管理下にあるべきファイルまたはディレクトリとして登録されているにも関わらず、その場所に異なる種類のファイルシステムオブジェクト(ファイルであるべき場所にディレクトリがある、またはその逆)が存在する状態です。
- 原因/表示される操作:
- バージョン管理下のファイルがあった場所に、同じ名前で新しいディレクトリを作成した場合。
- バージョン管理下のディレクトリがあった場所に、同じ名前で新しいファイルを作成した場合。
svn updateやsvn mergeを実行した際に、リモートの変更がローカルのファイルシステムオブジェクトと衝突した場合(例: リモートでファイルがディレクトリに変更されたが、ローカルにはまだ古いファイルがある)。
- 確認方法:
svn statusのデフォルト出力に表示されます。- 表示されているパスに対して
ls -lなどを実行し、期待される種類(ファイル/ディレクトリ)と異なっていることを確認します。
- 次のステップ/解決方法:
- この状態は通常、手動によるファイルシステム操作や不適切なマージ/アップデートによって発生します。まずは問題のオブジェクトを特定し、原因を把握します。
- 最も一般的な解決策は、原因となっているローカルのファイルシステムオブジェクトを削除し、
svn updateを実行してリポジトリの正しい種類のオブジェクトを取得し直すことです。 - あるいは、
!の場合と同様に、意図的に種類を変更した(例: ファイルを削除してディレクトリに置き換えた)のであれば、ローカルのオブジェクトを削除し、svn deleteを実行してSubversionに削除を知らせた後、新しいオブジェクトをsvn addするという手順を踏むべきでした。状態が~になってしまった場合は、ローカルのオブジェクトを削除し、svn revertで元のSVNアイテムを復元してから正しい手順で操作をやり直すことも検討できます。
- 注意点:
~は!と同様に作業コピーの状態異常を示します。多くの場合、不適切な手動操作の結果として発生します。速やかに正しい状態に戻す必要があります。 - 具体例:
- バージョン管理下のファイル
output/result.txtが存在するとします。 - OSコマンドで
output/result.txtファイルを削除し、同じ名前でディレクトリを作成します。
bash
rm output/result.txt
mkdir output/result.txt svn stを実行します。
bash
$ svn st
~ output/result.txt
output/result.txtの前に~が表示され、ファイルシステム上の種類がリポジトリ上の種類と異なっていることがわかります。
- バージョン管理下のファイル
X: External (外部定義)
- 意味: このディレクトリは、
svn:externalsプロパティによって別のリポジトリ(または同じリポジトリ内の別の場所)からチェックアウトされた外部定義ディレクトリです。このシンボルは、特に指定がない限り、外部定義ディレクトリ自体がsvn:externals設定によって管理されていることを示します。ただし、これは--depth externalsオプションが指定されていない限り、通常は表示されません。--depth externalsを指定した場合、このシンボルは「外部定義そのもの」が変更されていることを示す場合があります(この場合はカラム6にもXが表示されます)。 - 原因/表示される操作:
- 親ディレクトリに
svn:externalsプロパティが設定されており、その定義によって別のリポジトリやパスからチェックアウトされたディレクトリ。
- 親ディレクトリに
- 確認方法:
- デフォルトでは
svn stには表示されません。 svn status --depth externalsまたはsvn status -vオプションを指定すると表示されることがあります。- 親ディレクトリのプロパティを
svn propget svn:externals <親ディレクトリ名>で確認することで、外部定義が設定されているかを確認できます。
- デフォルトでは
- 次のステップ/解決方法:
Xシンボルが表示されていること自体は、通常問題ありません。それが外部定義ディレクトリであることを示しているだけです。- もし外部定義そのものを変更したい場合は、親ディレクトリの
svn:externalsプロパティを編集し(svn propedit svn:externals <親ディレクトリ名>)、そのプロパティ変更をコミットします。
- 注意点: 外部定義されたディレクトリの内容に対する変更(ファイルの追加、変更など)は、その外部定義元のリポジトリに対する変更として扱われます。外部定義されたディレクトリ内で
svn stを実行すると、その外部定義元のリポジトリに基づいた状態が表示されます。 - 具体例:
lib/ディレクトリにsvn:externalsプロパティを設定し、別のリポジトリからライブラリをチェックアウトするように定義します。
bash
svn propset svn:externals "my-lib http://example.com/svn/my-lib" lib- プロパティ変更をコミットし、
svn updateを実行して外部定義を反映します。
bash
svn commit -m "Add external library" lib
svn update svn st --depth externalsを実行します。
bash
$ svn st --depth externals
X lib/my-lib
lib/my-libが外部定義ディレクトリとしてXと表示されます。
L: Locked (ロックされている)
- 意味: このアイテムは、
svn lockコマンドによってロックされており、他のユーザーがリポジトリ上でこのアイテムを変更できない状態になっています。そして、作業コピー上ではローカルでの変更がない状態です。もしローカルで変更がある場合は、MLのように表示されます(カラム1: M, カラム4: L)。 - 原因/表示される操作:
svn lock <ファイル名>コマンドを成功させた場合。
- 確認方法:
svn statusのデフォルト出力に表示されます。svn info <ファイル名>コマンドを実行すると、ロックに関する詳細情報(誰がいつロックしたか)が表示されます。
- 次のステップ/解決方法:
- ファイルを変更してコミットする場合、ロックは自動的に解除されることが一般的です(設定によります)。
- ロックを解除したい場合は、
svn unlock <ファイル名>コマンドを実行します。 - 他の人が取得したロック(カラム4が
O)を強制的に解除したい場合は、--forceオプション付きでsvn unlockを実行します(ただし、通常はロックした本人に解除してもらうべきです)。
- 注意点: ロックは、バイナリファイルなどマージが困難なファイルを複数人で同時に編集する際に使用されることが多い機能です。テキストファイルの場合は、通常ロックを使用せず、マージで対応します。
Lはローカル変更がないロック、MLはローカル変更があるロックを示します。カラム4のシンボルと合わせて判断する必要があります。 - 具体例:
binary_image.jpgというファイルをロックします。
bash
svn lock binary_image.jpgsvn stを実行します。
bash
$ svn st
L binary_image.jpg
binary_image.jpgの前にLが表示され、ローカル変更がない状態でロックされていることがわかります。
3.2. カラム2: プロパティの状態
このカラムは、アイテムのプロパティ(svn:ignore, svn:executable, svn:keywords, svn:mime-type など)の状態を示します。
M: Modified (プロパティ変更)
- 意味: このアイテムのプロパティが、そのアイテムのベースリビジョンから変更されています。アイテムの内容自体は変更されていない可能性があります。
- 原因/表示される操作:
svn propset,svn propdel,svn propeditなどのコマンドでプロパティを変更した場合。
- 確認方法:
svn propget <プロパティ名> <ファイル名/ディレクトリ名>で現在のプロパティ値を確認できます。svn diff --properties-only <ファイル名/ディレクトリ名>で、プロパティ変更の差分を確認できます。
- 次のステップ/解決方法:
- プロパティ変更をリポジトリに反映するには、
svn commit <ファイル名/ディレクトリ名>を実行します。 - プロパティ変更を取り消す場合は、
svn revert --properties-only <ファイル名/ディレクトリ名>を実行します。
- プロパティ変更をリポジトリに反映するには、
- 注意点: アイテムの内容もプロパティも両方変更されている場合は、カラム1に
M、カラム2にMが表示され、MMとなります。 - 具体例:
my_script.shファイルに実行権限を示すプロパティを設定します。
bash
svn propset svn:executable on my_script.shsvn stを実行します。
bash
$ svn st
M my_script.sh
カラム1は空白(内容変更なし)、カラム2にMが表示され、プロパティが変更されたことがわかります。
C: Conflicted (プロパティ競合)
- 意味: このアイテムのプロパティに対して、
svn updateまたはsvn mergeコマンドの実行中にローカルでの変更とリポジトリ(またはマージ元)での変更が競合し、自動的に統合できなかった状態です。手動での競合解決が必要です。 - 原因/表示される操作:
- ローカルでプロパティを変更し、かつ他の人も同じアイテムのプロパティを変更して先にコミットした場合、その後に
svn updateを実行するとプロパティ競合が発生します。
- ローカルでプロパティを変更し、かつ他の人も同じアイテムのプロパティを変更して先にコミットした場合、その後に
- 確認方法:
svn status <ファイル名>:Cシンボルがカラム2に表示されていることを確認します。svn propget --revs BASE:THIS <プロパティ名> <ファイル名>などで、自分のベースリビジョンと現在のプロパティを比較したり、競合マーカーが挿入されたプロパティファイル(.prejファイルなど)を確認したりします。
- 次のステップ/解決方法:
- プロパティ競合は、通常、アイテム自体の内容競合 (
Cin カラム1) と同時に発生することが多いです。内容競合と同様に、競合マーカーを参照してプロパティ値を手動で統合します。 - 解決後、
svn resolved --properties-only <ファイル名/ディレクトリ名>コマンドを実行して、プロパティ競合が解決したことをSubversionに知らせます。アイテム自体の内容競合も同時に解決した場合は、svn resolved <ファイル名/ディレクトリ名>だけで内容とプロパティ両方の解決をSubversionに伝えることができます。 - 解決済みのプロパティ変更を
svn commit <ファイル名/ディレクトリ名>でリポジトリにコミットします。
- プロパティ競合は、通常、アイテム自体の内容競合 (
- 注意点: プロパティ競合もアイテム内容の競合と同様に、手動での正確な解決が必要です。
3.3. カラム3: コピー/移動の履歴
このカラムは、そのアイテムが履歴を持った状態で追加されたかどうかを示します。
+: Scheduled for addition with history (履歴付きで追加予定)
- 意味: このアイテムは、
svn copyまたはsvn moveコマンドによって作成され、元のアイテムの履歴を引き継いでバージョン管理に追加される予定になっています。カラム1は必ずAとなります。 - 原因/表示される操作:
svn copy <既存パス> <新しいパス>コマンドを実行した場合(新しいパスがバージョン管理下にない場合)。svn move <既存パス> <新しいパス>コマンドを実行した場合(新しいパスがバージョン管理下にない場合)。
- 確認方法:
svn info <新しいパス>: コピー元/移動元のリポジトリパスやリビジョン情報が表示されます。
- 次のステップ/解決方法:
- 履歴付きの追加をリポジトリに反映するには、
svn commit <新しいパス>を実行します。 - 追加を取り消す場合は、
svn revert <新しいパス>を実行します。これにより、ローカルのアイテムも削除されます。
- 履歴付きの追加をリポジトリに反映するには、
- 注意点: 単に新しいファイルを作成して
svn addした場合は、履歴を持たないため+は表示されず、カラム1がAとなるだけです。+が表示されるのは、既存のバージョン管理下アイテムの履歴を引き継いだ場合のみです。 - 具体例:
- バージョン管理下のファイル
template.htmlをindex.htmlとしてコピーします。
bash
svn copy template.html index.html svn stを実行します。
bash
$ svn st
A + index.html
index.htmlがA +と表示され、新規追加予定であり、かつ履歴(template.htmlからコピーされたこと)を持っていることがわかります。
- バージョン管理下のファイル
3.4. カラム4: ロックの状態
このカラムは、アイテムに対するリポジトリ上でのロックに関する情報を示します。このカラムの情報は、svn st を実行した時点でのローカルの作業コピーとリポジトリの状態を比較して表示されます。
K: Locked (作業コピーでロックを取得している)
- 意味: このアイテムに対して、あなたが
svn lockコマンドを使ってリポジトリにロックを取得しており、そのロックトークンを作業コピーが保持している状態です。これにより、あなた以外の誰もこのアイテムをリポジトリ上で変更してコミットできなくなります。 - 原因/表示される操作:
- あなたが
svn lock <ファイル名>コマンドを成功させた場合。
- あなたが
- 確認方法:
svn info <ファイル名>: ロックに関する詳細情報(所有者、UUID、有効期限など)が表示されます。
- 次のステップ/解決方法:
- ファイルを変更してコミットすると、通常はロックが自動的に解除されます(Subversionの設定による)。
- 手動でロックを解除する場合は、
svn unlock <ファイル名>コマンドを実行します。
- 注意点:
L(カラム1) はローカル変更がないロック、MLはローカル変更があるロックを示します。Kは作業コピーがロックトークンを持っていることを示しており、通常LまたはMLと同時に表示されます。例えば、M Kは「ローカルで変更があり、かつ自分がロックを持っている」状態です。
O: Other (他の誰かがロックを取得している)
- 意味: このアイテムに対して、あなた以外の別のユーザーがリポジトリにロックを取得している状態です。あなたがこのアイテムを変更してコミットしようとすると失敗します。
- 原因/表示される操作:
- 他のユーザーが
svn lock <ファイル名>コマンドを成功させ、そのロックがまだ解除されていない場合。 - 自分がローカルで変更(
M)を加えているファイルに対して、他のユーザーが先にロックを取得した場合。
- 他のユーザーが
- 確認方法:
svn info <ファイル名>: 誰がいつロックしたかなどの詳細情報が表示されます。
- 次のステップ/解決方法:
- ロックしているユーザーに連絡を取り、ロックを解除してもらうのが最善です。
- ロックしているユーザーと連絡が取れないなど、やむを得ない場合は、
svn unlock --force <ファイル名>コマンドで強制的にロックを解除することも可能ですが、これは最後の手段とすべきです。強制解除後は、ロックしていたユーザーに解除したことを伝えるべきです。
- 注意点: この状態のアイテムは、ロックが解除されるまでコミットできません。
T: Token exists (リポジトリにロックが存在するが、作業コピーにはない)
- 意味: このアイテムに対してリポジトリにロックが存在しますが、あなたの現在の作業コピーはそのロックに対応するトークンを持っていません。これは通常、あなたがロックを失ったか、別の作業コピーからロックを取得した場合に発生します。
- 原因/表示される操作:
- 以前に取得したロックを、何らかの理由で作業コピーが認識できなくなった場合。
- 同じユーザーとして、別の作業コピーでロックを取得した場合(ロックは通常、作業コピーごとに管理されます)。
- 確認方法:
svn info <ファイル名>: ロックが存在することを確認できます。
- 次のステップ/解決方法:
- もしあなたがそのロックを保持したい場合は、再度
svn lock <ファイル名>を実行してロックトークンを取得し直す必要があるかもしれません(既にロックされている場合は失敗する可能性があります)。 - もしそのロックが必要ないのであれば、単に放置しても問題ありません。
- リポジトリに存在する不要なロックを解除するには、
svn unlock <ファイル名>コマンドを実行します。
- もしあなたがそのロックを保持したい場合は、再度
B: Broken lock (壊れたロック)
- 意味: このアイテムに対してリポジトリにロックが存在しますが、そのロックは無効であるか、所有者が不明な状態です。これは通常、リポジトリの管理上の問題によって発生します。
- 原因/表示される操作:
- サーバー側の問題やリポジトリの不整合など。
- 確認方法:
svn info <ファイル名>: ロック情報に異常があることを確認できます。
- 次のステップ/解決方法:
- この状態はユーザー側で解決できないことが多いです。リポジトリの管理者に連絡し、サーバー側でのロックのクリーンアップなどの対応を依頼する必要があります。
- 注意点: 壊れたロックがある状態では、そのアイテムに対して正常なロック操作やコミットができない可能性があります。
3.5. カラム5: スイッチングの状態
このカラムは、作業コピー内の特定のアイテムが、その親ディレクトリがチェックアウトされているリポジトリパスとは異なるリポジトリパスに「スイッチ」されているかを示します。
S: Switched (スイッチされている)
- 意味: このアイテムを含むディレクトリ、またはそのアイテム自体が、
svn switchコマンドを使用して、親ディレクトリのURLとは異なるリポジトリURLに切り替えられています。これは、作業コピーの一部だけを別のブランチやタグに切り替える場合などに使用されます。 - 原因/表示される操作:
svn switch <別のリポジトリURL> [PATH]コマンドを実行した場合。
- 確認方法:
svn info [PATH]: アイテムの「URL」フィールドを確認します。親ディレクトリのsvn infoで表示されるURLと比較して、異なるパスになっている場合にSが表示されます。
- 次のステップ/解決方法:
Sと表示されていること自体は、意図的に行った操作であれば問題ありません。- 元のリポジトリパスに戻したい場合は、
svn switch <元のリポジトリURL> [PATH]コマンドを再度実行します。
- 注意点: スイッチされた作業コピーは、見た目は通常の作業コピーと似ていますが、一部の操作(例: 全体に対する
svn update)で予期しない結果になる可能性があります。どの部分がスイッチされているかを常に把握しておくことが重要です。 - 具体例:
- メインの作業コピーが
trunkを指しているとします。 feature_a/ディレクトリをfeature_a_branchにスイッチします。
bash
svn switch http://example.com/svn/myproject/branches/feature_a_branch feature_a/svn stを実行します。
bash
$ svn st
S feature_a
feature_a/ディレクトリがSと表示され、スイッチされた状態であることがわかります。
- メインの作業コピーが
3.6. カラム6: 外部定義の状態
このカラムは、--depth externals オプションを指定した場合にのみ表示され、svn:externals プロパティで定義された外部定義自体が変更されているかを示します。
X: External (外部定義の変更)
- 意味:
svn:externalsプロパティで定義された外部定義自体が変更された状態です。カラム1にもXが表示されることがあります。 - 原因/表示される操作:
- 親ディレクトリの
svn:externalsプロパティを編集した場合。
- 親ディレクトリの
- 確認方法:
svn status --depth externalsオプション付きで実行します。- 親ディレクトリのプロパティ変更を
svn diff --properties-only <親ディレクトリ名>で確認します。
- 次のステップ/解決方法:
- 親ディレクトリのプロパティ変更をコミットします。
- コミット後、
svn updateを実行すると、変更された外部定義に従って外部リポジトリのアイテムが更新されます。
- 注意点: この
Xは、カラム1のXとは表示されるカラムが異なります(カラム6)。カラム1のXは外部定義ディレクトリそのものを指しますが、カラム6のXは外部定義プロパティの変更を指します。 - 具体例:
- 親ディレクトリの
svn:externalsプロパティを変更します。
bash
svn propedit svn:externals .
# 外部定義のURLなどを編集する svn st --depth externalsを実行します。
bash
$ svn st --depth externals
X .
X lib/my-lib # 外部定義ディレクトリ自体のXも表示される
親ディレクトリ (.) に対してカラム6にXが表示され、外部定義プロパティが変更されたことがわかります。
- 親ディレクトリの
3.7. カラムの組み合わせ
前述のように、複数のカラムにシンボルが表示されることで、より詳細な状態を示すことができます。よくある組み合わせをいくつか紹介します。
MM file.txt: カラム1 (M) とカラム2 (M) が表示されています。これは、file.txtの内容とプロパティの両方が変更されていることを意味します。AM + new_file.txt: カラム1 (A)、カラム2 (M)、カラム3 (+) が表示されています。これは、new_file.txtが履歴付きで追加予定であり、かつプロパティも変更されていることを意味します(例: コピー後にプロパティを変更した場合)。M K file.txt: カラム1 (M) とカラム4 (K) が表示されています。これは、file.txtがローカルで変更されており、かつあなたがそのファイルに対してロックを取得していることを意味します。C C file.txt: カラム1 (C) とカラム2 (C) が表示されています。これは、file.txtの内容とプロパティの両方で競合が発生していることを意味します。
これらの組み合わせを理解することで、svn st の出力から作業コピーの複雑な状態を正確に読み解くことができます。
4. --show-updates (-u) オプションによる追加シンボル
デフォルトの svn st は、作業コピーとそのベースリビジョンとの間の差異を表示します。しかし、Subversionリポジトリはあなた以外の開発者によっても変更されている可能性があります。あなたがローカルで作業している間に、他の誰かがファイルをコミットするかもしれません。
--show-updates または -u オプションを付けて svn st を実行すると、Subversionはリポジトリの最新リビジョンと作業コピーの状態を比較し、ローカルでの変更に加えて、リポジトリに存在するがまだ作業コピーに取り込まれていない変更に関する情報も表示してくれます。これは svn update を実行する前に、どのような変更が取り込まれる可能性があるかを確認するために非常に役立ちます。
このオプションを使用すると、出力フォーマットにさらに2つのカラムが追加されます。
状態シンボル (6カラム) リポジトリの状態 作業コピーのリビジョン アイテムのパス
追加されるカラムの詳細
- カラム7 (リポジトリの状態): 作業コピーのアイテムが、リポジトリのHEADリビジョンと比較してどのような状態にあるかを示します。
- 表示されるシンボル:
*,A,D,M(これらは遠隔の状態を示すため、区別して考える必要があります)
- 表示されるシンボル:
- カラム8 (作業コピーのリビジョン): そのアイテムの作業コピーが基づいているリビジョン番号が表示されます。
追加されるシンボルの詳細
*: Update required (更新が必要)
- 意味: リポジトリのHEADリビジョンではこのアイテムが変更されていますが、あなたの作業コピーはその変更をまだ取り込んでいない状態です。つまり、
svn updateを実行すると、このアイテムがリポジトリの最新バージョンに更新される予定であることを示します。 - 原因/表示される操作:
- あなたがローカルで作業している間に、他のユーザーがこのアイテムを変更してリポジトリにコミットし、かつあなたがまだ
svn updateを実行していない場合。
- あなたがローカルで作業している間に、他のユーザーがこのアイテムを変更してリポジトリにコミットし、かつあなたがまだ
- 確認方法:
svn status --show-updatesまたはsvn st -uを実行します。svn log -r HEAD:BASE <ファイル名>で、あなたのベースリビジョン以降にリポジトリで行われた変更を確認できます。
- 次のステップ/解決方法:
- リポジトリの最新状態を反映するには、
svn update <ファイル名/ディレクトリ名>またはsvn update(作業コピー全体) を実行します。 svn updateを実行する前にローカル変更 (MやA,Dなど) がある場合、リポジトリの変更と衝突して競合 (C) が発生する可能性があります。ローカル変更をコミットするか、svn diffで変更内容を確認し、競合が発生する可能性を判断することが推奨されます。
- リポジトリの最新状態を反映するには、
- 注意点:
*は、ローカルでの変更の有無とは独立して表示されます。ローカル変更がない (*) 場合もあれば、ローカル変更とリモート変更がある (M *) 場合もあります。
:: No updates (更新不要)
- 意味: リポジトリのHEADリビジョンとあなたの作業コピーのこのアイテムは同じ状態(またはリポジトリ側にはあなたより新しい変更がない状態)です。
svn updateを実行しても、このアイテムは更新されません。 - 原因/表示される操作:
- リポジトリでこのアイテムに対する新しいコミットがない場合。
- あなたが最近
svn updateを実行し、このアイテムが最新の状態になった場合。
- 確認方法:
svn st -uの出力で、カラム7が空白になっていることを確認します。
- 次のステップ/解決方法:
- 特別なアクションは不要です。このアイテムに関しては、リポジトリの最新状態に対してあなたの作業コピーは最新である(または、少なくともリポジトリ側にはまだ取り込むべき新しい変更がない)ことを意味します。
A (遠隔): Added in repository (リポジトリで追加)
- 意味: このアイテムはあなたの作業コピーには存在しませんが、リポジトリのHEADリビジョンで新しく追加されています。
svn updateを実行すると、このアイテムがあなたの作業コピーに追加されます。 - 原因/表示される操作:
- 他のユーザーが新しいファイルやディレクトリをコミットし、あなたがまだ
svn updateを実行していない場合。
- 他のユーザーが新しいファイルやディレクトリをコミットし、あなたがまだ
- 確認方法:
svn st -uの出力で、カラム7にAが表示されていることを確認します。svn log -r HEAD:BASEなどで、リポジトリに追加されたアイテムの情報を確認できます。
- 次のステップ/解決方法:
- 新しいアイテムを作業コピーに取り込むには、
svn update <ファイル名/ディレクトリ名>またはsvn updateを実行します。
- 新しいアイテムを作業コピーに取り込むには、
- 注意点: あなたが同じ名前のアイテムをローカルで作成済みで
?となっている場合、svn updateを実行すると競合が発生する可能性があります。
D (遠隔): Deleted in repository (リポジトリで削除)
- 意味: このアイテムはあなたの作業コピーには存在しますが、リポジトリのHEADリビジョンでは削除されています。
svn updateを実行すると、このアイテムがあなたの作業コピーから削除されます。 - 原因/表示される操作:
- 他のユーザーがこのアイテムを
svn deleteしてコミットし、あなたがまだsvn updateを実行していない場合。
- 他のユーザーがこのアイテムを
- 確認方法:
svn st -uの出力で、カラム7にDが表示されていることを確認します。svn log -r HEAD:BASEなどで、リポジトリで削除されたアイテムの情報を確認できます。
- 次のステップ/解決方法:
- リポジトリの削除を反映するには、
svn update <ファイル名/ディレクトリ名>またはsvn updateを実行します。 - あなたがこのアイテムをローカルで変更している場合 (
M Dのように表示される)、svn updateを実行すると、ローカルの変更は通常失われるか、衝突が発生する可能性があります。変更を保持したい場合は、svn updateを実行する前にローカル変更をコミットするか、他の場所にバックアップする必要があります。
- リポジトリの削除を反映するには、
- 注意点: ローカルで変更があるアイテムに対してリモート削除 (
Din カラム7) が表示されている場合、特に注意が必要です。不用意なsvn updateでローカル変更が失われる可能性があります。
M (遠隔): Modified in repository (リポジトリで変更)
- 意味: このアイテムはあなたの作業コピーにもリポジトリにも存在しますが、リポジトリのHEADリビジョンで内容が変更されています。
svn updateを実行すると、このアイテムがリポジトリの最新バージョンに更新されます。 - 原因/表示される操作:
- 他のユーザーがこのアイテムを変更してコミットし、あなたがまだ
svn updateを実行していない場合。
- 他のユーザーがこのアイテムを変更してコミットし、あなたがまだ
- 確認方法:
svn st -uの出力で、カラム7にMが表示されていることを確認します。svn diff -r BASE:HEAD <ファイル名>で、リポジトリでの変更内容とあなたの作業コピーのベースリビジョンとの差分を確認できます。
- 次のステップ/解決方法:
- リポジトリの最新状態を反映するには、
svn update <ファイル名/ディレクトリ名>またはsvn updateを実行します。 - あなたがこのアイテムをローカルで変更している場合 (
M Mのように表示される)、svn updateを実行すると、Subversionは自動マージを試みます。マージに成功すればMのままですが、マージできなかった場合は競合 (C) が発生します。svn diffやsvn st -uの結果を見て、競合の可能性を判断することが推奨されます。
- リポジトリの最新状態を反映するには、
- 注意点: ローカル変更 (
Min カラム1) とリモート変更 (Min カラム7) が同時に存在する場合、svn updateで競合が発生する可能性が高いです。svn updateを実行する前に、ローカル変更をコミットするか、マージに備える必要があります。
カラム8: 作業コピーのリビジョン
このカラムには、そのアイテムの作業コピーが基づいているリビジョン番号が表示されます。
svn checkoutやsvn updateを実行すると、作業コピーは特定のリビジョン(通常はHEADリビジョン)に基づいた状態になります。このリビジョン番号がここに表示されます。svn st -uの出力で、リポジトリのHEADリビジョンより低いリビジョンが表示されているアイテムは、*またはリモートA,D,Mのいずれかの状態になっている可能性が高いです(つまり、更新が必要なアイテムです)。- 例えば、
M * 9 my_file.txtと表示されている場合、my_file.txtはローカルで変更されており (M)、かつリポジトリのHEADリビジョン (例: 10) では変更されており (*)、あなたの作業コピーのこのファイルのベースリビジョンは 9 であることを意味します。
svn st -u はリポジトリとの同期状態を把握するために非常に強力なオプションです。svn update を実行する前に必ず確認し、ローカルでの変更とリポジトリでの変更の間にどのような関係があるかを理解することが、安全なバージョン管理の実践につながります。
5. svn st の出力を読み解き、次のアクションを決める
svn st コマンドの出力シンボルを理解することで、現在の作業コピーの状態を正確に把握できます。そして、その状態に基づいて、次に取るべき適切なアクション(コミット、アップデート、競合解決、追加、削除、元に戻すなど)を判断することができます。
以下に、表示される代表的なシンボルと、それを見たときに考えられる一般的な次のアクションを示します。
M(Modified) またはA(Added) またはD(Deleted) (カラム1):- ローカルで変更、追加、または削除されたファイルやディレクトリがあります。
- 次のアクション: 変更内容を確認し(
svn diff)、問題なければsvn commitでリポジトリに反映します。もし不要な変更であればsvn revertで取り消します。
?(Unversioned):- バージョン管理下にない新しいファイルやディレクトリがあります。
- 次のアクション: これらをバージョン管理下に置きたい場合は
svn addします。バージョン管理する必要がない場合はsvn ignoreで無視設定を行うか、単に削除します。
!(Missing) または~(Obstructed):- 作業コピーの状態が異常です(ファイルが見つからない、種類が違うなど)。
- 次のアクション: 原因を特定します。意図しない削除であれば
svn updateまたはsvn revertで復元します。意図的に削除したのであれば、改めてsvn deleteコマンドを実行します。作業コピー全体が不完全な場合はsvn cleanupを試みます。
C(Conflicted) (カラム1または2):- 内容またはプロパティの競合が発生しています。
- 次のアクション: 競合しているファイルをテキストエディタで開き、競合マーカーを参考に手動で変更を統合します。統合が完了したら
svn resolvedを実行して解決をSubversionに知らせ、その後svn commitします。
A +(Added with history):svn copyまたはsvn moveで履歴付きで追加されたアイテムがあります。- 次のアクション: 追加内容を確認し、問題なければ
svn commitでリポジトリに反映します。
MM(Modified and Property Modified):- 内容とプロパティの両方が変更されています。
- 次のアクション: 変更内容とプロパティ変更を確認し(
svn diff,svn diff --properties-only)、問題なければsvn commitでリポジトリに反映します。
R(Replaced):- アイテムが削除され、同じ名前の新しいアイテム(履歴付きの場合あり)で置き換えられています。
- 次のアクション: 置き換え内容を確認し、問題なければ
svn commitでリポジトリに反映します。
L(Locked) またはK(Has lock) (カラム1または4):- アイテムがロックされています。
- 次のアクション: ロックが必要な場合はそのまま作業を進めます。不要な場合は
svn unlockで解除します。他の人がロックしている場合は、そのユーザーに連絡を取ります。
S(Switched) (カラム5):- 作業コピーの一部が別のリポジトリパスにスイッチされています。
- 次のアクション: 意図したスイッチであれば問題ありません。元のパスに戻したい場合は
svn switchを再度実行します。
*(Update required) (カラム7 with-u):- リポジトリに新しいバージョンが存在します。
- 次のアクション:
svn updateで最新の状態を取り込みます。ローカルに変更がある場合は、競合が発生する可能性に注意が必要です。
- 遠隔
A(Added in repository) (カラム7 with-u):- リポジトリで新しいアイテムが追加されています。
- 次のアクション:
svn updateでそのアイテムを作業コピーに取り込みます。ローカルに同じ名前の?ファイルがある場合は競合に注意が必要です。
- 遠隔
D(Deleted in repository) (カラム7 with-u):- リポジトリでアイテムが削除されています。
- 次のアクション:
svn updateで作業コピーからアイテムを削除します。ローカルに変更がある場合は、変更が失われる可能性に注意が必要です。
- 遠隔
M(Modified in repository) (カラム7 with-u):- リポジトリでアイテムが変更されています。
- 次のアクション:
svn updateで最新の状態を取り込みます。ローカルに変更がある場合は、マージまたは競合発生の可能性に注意が必要です。
これらのガイドラインは一般的なものですが、常に svn st の出力全体を注意深く確認し、必要に応じて svn diff, svn info, svn log などの他のコマンドと組み合わせて状態を把握することが重要です。特にチームで作業している場合、svn st -u はリポジトリの最新状態を把握するために不可欠なコマンドとなります。
6. その他の便利なオプション
svn st コマンドには、より詳細な情報を表示したり、出力を絞り込んだりするためのいくつかの便利なオプションがあります。
-vまたは--verbose: 各アイテムの最終コミットリビジョン、作者、リポジトリURLなどの詳細情報を表示します。デバッグや状態の確認に役立ちます。svn st -vの出力は、svn stのデフォルトの6カラムのシンボルに加えて、これらの詳細情報が表示される形式になります。-qまたは--quiet: バージョン管理外 (?) のアイテムを表示しません。多数の一時ファイルがある場合に、本当に変更があったバージョン管理下のアイテムだけを確認したい場合に便利です。--no-ignore: 無視リスト (svn:ignoreなど) に登録されていて、通常は表示されない無視状態 (I) のアイテムも表示します。意図せず無視されているファイルがないか確認したい場合に役立ちます。--depth ARG: 指定した深さまでだけ状態を表示します。empty,files,immediates,infinityなどの引数を取ります。--rev REV: 特定のリビジョン時点でのアイテムの状態を表示します(Subversion 1.5 以降)。
これらのオプションを組み合わせることで、知りたい情報に応じて svn st の出力をカスタマイズできます。例えば、ローカルでの変更だけを静かに確認したい場合は svn st -q、リモートの変更も含めて詳細に確認したい場合は svn st -u -v のように使い分けます。
7. まとめ:svn st をバージョン管理の羅針盤として活用する
この記事では、Subversion の svn status (svn st) コマンドの出力に表示される様々なシンボルの意味について、詳細に解説しました。
svn stは作業コピーの状態を把握するための最も基本的なコマンドです。- 出力は複数のカラムで構成され、それぞれのカラムがアイテム自身、プロパティ、履歴、ロック、スイッチング、外部定義など、異なる側面の状態を示しています。
- 主要なシンボル (
A,M,D,C,?,!,~,R,I,X,L) を理解することで、ローカルでの変更や作業コピーの異常状態を把握できます。 --show-updatesオプションを追加すると、リポジトリとの比較による状態 (*, 遠隔A,D,M) や作業コピーのリビジョンも表示され、svn update前の確認に役立ちます。- 表示されたシンボルに基づいて、次に取るべき適切なアクション(コミット、アップデート、解決、追加、削除、元に戻す、無視など)を判断することができます。
svn st の出力を常に確認し、表示されるシンボルの意味を正確に読み解くことは、SVNを用いたバージョン管理を効率的かつ安全に進めるための基礎中の基礎です。まるで羅針盤のように、現在の位置(作業コピーの状態)を正確に示してくれる svn st コマンドを、あなたのSVNワークフローに不可欠なツールとして活用してください。
初めは多くのシンボルに戸惑うかもしれませんが、作業を進める中で繰り返し svn st を実行し、その時の操作や結果と表示されるシンボルを結びつけて理解を深めていくことで、徐々に慣れていくはずです。この記事が、その学習の一助となれば幸いです。
SVNでの開発ライフをよりスムーズで確実なものにするために、今日から svn st マスターを目指しましょう!