Subversion (svn)

以下は、gitをCUIのみで使っている筆者がsvnを使わないといけなくて、かつCUIのみで使いたいときに、gitとの比較の観点でsvnコマンドの使い方を調べたメモです。

gitとの違い

参考

スポンサーリンク

チェックアウト

# チェックアウト
# (カレントディレクトリにtrunkというディレクトリが作成される)
svn checkout svn://id@host/path/to/svnroot/trunk

# カレントディレクトリにチェックアウト
svn checkout svn://id@host/path/to/svnroot/trunk .

# 作成されるディレクトリの名前を指定してチェックアウト
# (カレントディレクトリにhogeというディレクトリが作成される)
svn checkout svn://id@host/path/to/svnroot/trunk hoge

詳細情報表示

# カレントディレクトリの詳細情報を表示
svn info

# 作業用ディレクトリ特定のパスを指定して詳細情報を表示
svn info foo/bar

ログ表示

# リポジトリのルートを指定してログを表示
svn log svn://id@host/path/to/svnroot

# リポジトリの特定のパスを指定してログを表示
# ファイルでもディレクトリでも可能
svn log svn://id@host/path/to/svnroot/trunk/foo/bar

# リポジトリの特定のリビジョンを指定してログを表示
svn log svn://id@host/path/to/svnroot/trunk/foo/bar@r999

# リポジトリの特定のリビジョンを指定してログを表示
svn log svn://id@host/path/to/svnroot@r999

# カレントディレクトリのログを表示
svn log

# 作業用ディレクトリの特定のパスを指定してログを表示
svn log foo/bar

差分表示

# カレントディレクトリの最後のコミットと作業用ディレクトリとの差分を表示
svn diff

# カレントディレクトリについてのリビジョン間の差分を表示
svn diff -r r998:r999

# 差分のファイル名のみを表示
svn diff --summarize -r r998:r999

# 作業用ディレクトリの特定のパスについてのリビジョン間の差分を表示
svn diff -r r998:r999 foo/bar

# リポジトリの特定のパスとリビジョンを指定して差分を表示
svn diff svn://id@host/path/to/svnroot/trunk@r998 svn://id@host/path/to/svnroot/tags/hoge@r999

ファイル一覧表示

# カレントディレクトリのファイル一覧を表示
# (まだaddしていないファイルがあれば、それは表示されない。
#  まだrmしていない削除済みファイルは表示される)
svn ls

# ファイル一覧を詳細に表示 (ls -l みたいな)
svn ls -v

# ファイル一覧をサブディレクトリも再帰的に表示 (find みたいな)
svn ls -R

# 作業用ディレクトリ特定のパスを指定してファイル一覧を表示
svn ls foo/bar

# リポジトリの特定のパスを指定してファイル一覧を表示
svn ls svn://id@host/path/to/svnroot/trunk/foo/bar

新規作成ファイルの登録

# ファイルをステージングに登録
# git add newhoge.txt に相当
svn add newhoge.txt

# ディレクトリをステージングに登録
# ディレクトリの中も再帰的に登録
# git add newhogedir に相当
svn add newhogedir

既存ファイルの削除

# ファイル削除をステージングに登録
# git rm hoge.txt に相当
# ディレクトリに対しても同じコマンドで可能
svn delete hoge.txt

コミット

# コミット
# git commit && git push に相当(?)
# svn update しないと、svn log したときの結果には反映されない
# コミットメッセージを入力するエディタが開く
svn commit && svn update

# コミットメッセージを指定してコミット
# git commit -m "hogehoge message" && git push に相当(?)
svn commit -m "hogehoge message" && svn update

編集取り消し

# まだコミットしていない編集済みのファイルを元に戻す
# git checkout foo/bar.txt に相当
svn revert foo/bar.txt

更新を取り込むには

# 更新を取り込む
# git pull に相当(?)
# カレントディレクトリ配下のみをとり込むので、
# 作業ディレクトリのルートより下で実行すると
# カレントディレクトリは以下とそれより上のディレクトリとで
# リビジョンがずれる
svn update

# ディレクトリを指定して更新を取り込む
svn update ../hogedir

update前に手動でファイルをいじっていても、結果的にupdate後と同じ状態にしてあれば、svn update は成功する。

ブランチの作成

svn copy svn://id@host/path/to/svnroot/trunk svn://id@host/path/to/svnroot/branches/hoge -m "hogehoge message"

タグの設定

svn copy svn://id@host/path/to/svnroot/trunk svn://id@host/path/to/svnroot/tags/hoge -m "hogehoge message"

または、ローカルにtrunk, tagsディレクトリの存在する作業ディレクトリがあれば

# trunkに対してタグを設定する
# trunk, tagsディレクトリの存在する作業ディレクトリにて
svn copy trunk tags/hogehoge && svn commit -m "commit message"

作業ディレクトリを特定のブランチに切り替え

# git checkout hoge に相当
svn switch svn://id@host/path/to/svnroot/branches/hoge

マージ

# hogeブランチをtrunkにマージ。現在の作業ディレクトリがtrunkだとして
# hogeブランチを作ったリビジョンが99だとして
svn merge -r 99:HEAD svn://id@host/path/to/svnroot/branches/hoge
svn commit -m "hogehoge message"

マージしたあとのコミットはなぜか svn update しなくてもローカルのリビジョン番号が上がる。

レポジトリ作成

# カレントディレクトリをレポジトリにする
# git init --bare . に相当
svnadmin create .
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク