Daily Grind

システム開発関連の忘備録です

Linuxでのsvnの使い方

※もしかしたらまちがってるかも


■■Linux SVN(Subversion) の使い方メモ

svn のヘルプ
svnのコマンド一覧の表示
$ snv help

●個別コマンドのヘルプは、helpの後にコマンド名を指定します。
例えばcommitコマンドなら次のようにします。
$ svn help commit


●便利な使い方の例

自分がファイルを変更したかどうかの確認。
していれば行頭にM付いて表示される。
$ svn status ファイル名

チェックアウト後(または最後のupdate以降)、誰かがファイルをコミットしの確認。
していれば * が付いて表示される。
$ svn status -u ファイル名

チェックアウト後(または最後のupdate以降)、自分が行った変更の差分があれば表示。
$ svn diff ファイル名

チェックアウト後(または最後のupdate以降)、自分が行って変更を、誰かがコミットしていればコミット後のファイルに対しての差分を表示。
自分が変更していない場合、誰かがコミットしていれば、差分が表示される。
$ svn diff -rHEAD ファイル名

最後にコミットを行った者の名前を表示。
$ svn status -v ファイル名

チェックアウト後(または最後のupdate以降)、最後にコミットを行った者の名前を表示
$ svn status -uv ファイル名


詳しくは下記を参照

■更新操作(リポジトリから作業コピーへの反映)
次のようにupdateコマンドにファイルパスまたはディレクトリパスを指定すると指定ファイルまたは
指定ディレクトリ以下が最新リビジョンに更新されます。
$ svn update パス

※パスにはディレクトリ名またはファイル名を指定します(複数可)。
※パスを省略した場合はカレントディレクトリを指定したものとみなされます。

例)更新
$ svn update Version_update
U Version_update
リビジョン 7524 に更新しました。

※更新情報の先頭文字は次の意味を持ちます
A 追加されました
D 削除されました
U 更新されました
C 衝突しています
G マージされました

■更新の事前確認
updateを行う前に更新が行われるかどうか(誰かがファイルを更新しているか)を
確認するには次のようにします。
$ svn status -u パス

※パスにはディレクトリ名またはファイル名を指定します(複数可)。
※パスを省略した場合はカレントディレクトリを指定したものとみなされます。

例)更新の事前確認
$ svn status -u
* 7521 test.c
? Test.dtf
状態の背景となるリビジョン: 7523

この例で
7521は作業コピーファイルのリビジョンを示し、
* はリポジトリに新しいリビジョンが存在することを示します。
? はSVN管理されていないファイルであることを示します。
最終行の「状態の背景となるリビジョン:」は現在のSVN管理されている最新の
リビジョン(このファイルに限らずSVN管理されている全体を含めた最新のリビジョン)が
7523であることを示します。
これらの情報から、誰かがtest.cを変更してリビジョンが上がっているので、
更新を行うとtest.cが更新され7523にリビジョンアップすることが分かります。

stausコマンドに -v オプションを付加すると誰がこのファイルを最後に書き換えた
(コミットした)かが分かります。
※パスを指定しない場合はカレントディレクトリの全ファイルについて表示されます。

例)更新の事前確認 最終コミット者の確認
$ svn status -uv test.c
* 7521 7520 tanaka test.c ←tanaka が最終コミット者です
状態の背景となるリビジョン: 7523

※パスを指定しない場合、stausの-vや-uオプションではカレントディレクトリの全ファイル
について表示されてしまうので、grepでフィルタリングすると便利です。
$ svn status -u | grep -v ? ←SVN管理外ファイルを表示しない(?を含まない行のみ表示)

$ svn status -uv | grep '^M' ←自分が変更を加えたファイルのみ表示する(行の先頭がMで始まるものを表示)。

■コミット操作
同じlinuxユーザでログインしている場合、svnのコミットユーザを指定するには -username オプションを指定します。

例)svnのユーザ名を「xxxxx」、 メッセージを「修正 #1234 #5678」としてして src/sensor/Test/test.c を修正
$ svn commit --username xxxxx -m '修正 #1234 #5678' src/sensor/Test/test.c

※一度、usernameを指定すると、以降(同一セッション?)も覚えているので毎回usernameを
指定する必要はありません(パスワードも同様)

■コミットの事前確認
commitを行う前に自分が作業コピーに加えた変更(差分)を確認するには次のようにします。
$ svn diff パス

※パスにはディレクトリ名またはファイル名を指定します(複数可)。
※パスを省略した場合はカレントディレクトリを指定したものとみなされます。

コミット時にすでに別のユーザが変更(コミット)を行っている場合は自分が行った変更と
別ユーザが行った変更が重なってしまうので、マージ処理等が行われます。
そのため、コミット前に、更新の事前確認で述べた確認を行うと変更されているかが確認できます。

例)更新の事前確認 コミット予定ファイルについて最終コミット者の確認
$ svn status -uv パス | grep '^M'

M * 7521 7520 tanaka test.c ←tanaka が既にコミットしています。
状態の背景となるリビジョン: 7523

※1行目のMは自分で作業コピーを変更したことを示します
* は誰かが変更を加えた新しいリビジョンが存在することを示します。
従って、* が表示されなければ自分の変更のみがコミットされます(ただし、
この確認からコミットまでの間に誰かがコミットしてしまう可能性は残ります)。

別ユーザが変更を行ったファイルと自分が変更したファイルとの差分の確認
$ svn diff -r HEAD パス

※-r HEADオプションを付けないと、自分が行った変更分のみ表示されます。
※パスにはディレクトリ名またはファイル名を指定します(複数可)。
※パスを省略した場合はカレントディレクトリを指定したものとみなされます。


■作業コピーを元に戻す場合
現在の作業コピーのリビジョンに戻す(自分が加えた変更を戻す)には次のようにします。
$ svn revert パス

※パスにはディレクトリ名またはファイル名を指定します(複数可)。
※パスを省略した場合はカレントディレクトリを指定したものとみなされます。
※該当ファイルを削除(またはリネーム)してから、updateしても同様の効果となります。


■■当ビルド環境での固有な問題
現在、ビルド後にSVN管理ファイルが消えてしまい更新(update)が行えない(エラーとなる)
ファイルが存在します。
その場合は、更新するパス(ディレクトリ、ファイル)を指定して更新を行ってください。
そのためメールで流れるコミット情報を確認し、こまめに更新を行っておくと便利です。

例) Product/.svnが消えた場合
Version_updateファイルがあるディレクトリへ移動して確認してもエラーとなります。

[builder@DEVenv5]$ svn status -u ←★更新の事前確認
svn: 作業コピー管理領域を含むディレクトリ 'Product/.svn' がありません

Version_updateファイルを指定すると確認できます

[builder@DEVenv5]$ svn status -u Version_update ←★パス(ファイル名)を指定しての更新の事前確認
* 7524 Version_update
状態の背景となるリビジョン: 7568

ファイル名を指定すると更新もできます

[builder@DEVenv5]$ svn update Version_update ←★パス(ファイル名)を指定して更新
U Version_update
リビジョン 7568 に更新しました。