基本的な作業サイクル

次の順序を守っていれば基本問題はありません。

  • 作業コピー(ローカル)の更新
svn up(update)
  • 作業コピー(ローカル)の変更
svn add
svn delete
svn copy
svn move
  • 自分の変更点の確認
svn st(status)
svn diff
svn revert

svn diff: 編集したものとレポジトリとの差を表示します
svn revert: 編集したものを削除してレポジトリの最新リビジョンで置き換える。作業予告を取り消します

  • コミット
svn ci(commit) [-m 'コミットログ']

リビジョン・キーワード

  • HEAD : レポジトリの最新リビジョン
svn diff --revision HEAD

作業コピーとレポジトリ最新リビジョンとの差異を表示

  • BASE : ローカルで最後にアップデートした時のリビジョン
svn diff --revision BASE:HEAD filename

filenameのローカルでのアップデートした時と最新のリビジョンとの差異を表示

  • COMMITED : BASE以前に、ファイルかディレクトリが変更された最後のリビジョン
  • PREV : COMMITED-1のリビジョン
svn diff --revision PREV:COMMITED filename

filenameのレポジトリにおける最後の変更の内容を表示

知っ得コマンド

  • ファイルは無視してディレクトリだけレポジトリに追加
svn add --non-recursive dir_name
svn status
  • 管理化にないファイルを非表示
svn st(status) --quiet(-q)
  • 編集したファイルだけではなくすべてのファイルの状態を表示
svn st --verbose(-v)
  • レポジトリと通信をおこないHEADよりも古いファイルを表示
svn st --show-updates(-u)
    • -
M * 44 23 hoge foo.c

'*'が表示されたファイルが、HEADよりも古いことを示す

  • パッチを作成
svn diff > patch_file 
  • 特定リビジョン同士の差を表示
svn diff -r 10:20
  • ファイルの特定リビジョンでの内容を表示
svn cat -r 10 filename
  • 特定のリビジョンのバイナリデータ(画像..etc)を出力
svn cat -r 10 image.jpg > image.jpg.v10
  • ロックを解除する
svn cleanup

Confilct(衝突)時の挙動

  • filenameに衝突マーカが置かれ、衝突内容が明記されます。
  • filename.mineが作成される。(ローカルに存在した最後の変更内容)
  • filename.rBASE (BASEリビジョンのファイル)
  • filename.rHEAD (HEADリビジョンのファイル)

これら3つの一時ファイルが削除されるまで(衝突が解決されるまで)、
subversionはこのファイルのコミットを許してくれません。
衝突の解決の手順としては、

  1. 手動で衝突マーカが置かれた源ファイルを修正
  2. 上記3つのfilename.*のうちの1つで源ファイルを上書き
  3. svn revert filename としてローカルでの変更を取り消す

のうちの1つを行ないます。
svn revert以外の解決策を選択した場合は、

svn resolved filename

として、Subversionに衝突が解決されたことを通知します。
svn resolvedコマンドによって、一時ファイルが削除されるので、
コミットを行なうことができるようになります。

svn revertを選択した場合、自動で一時ファイルが削除され、
filenameをBASEの状態に戻したことをsubversionに通知するので、
svn resolvedコマンドを実行する必要はありません。


これらのコマンドさえ扱えれば、svn clientは十分使えると思います:-)

appendix 管理者用

svnlook diff -r {revision_number} {repo_path}
svnlook changed -r {revision_number} {repo_path}
svnlook history -r {revision_number} {repo_path} {path_to_directory}
svnlook youngest {repo_path}

diff : そのリビジョンで変更した各ファイルの変更内容(diff)の表示
changed:そのリビジョンで変更したファイルの一覧
history: {path_to_directory}のディレクトリでの変更履歴の表示
youngest: レポジトリ内の最新のリビジョン番号を表示