• CVSの後継。徐々にCVSを置き換えていてオープンソースプロダクトでは採用多数。2007年ぐらいから企業でも採用事例続々でてきた。2009年後半より自宅でも利用中

特徴

  • CVSと違いファイルの移動やリネームしても履歴は継続される
  • 複数ファイルのcommitを1つのコミットとして扱える(グループコミット)
  • 賛否両論あろうが排他制御ができるようになった(昔は取り入れないといっていたのに)

よく使うコマンド

属性の確認と設定

svn proplist ファイル名
svn propset svn:exacutable true ファイル名

svnからとってくる

  • 深さを指定しないと全部とってくる
svn co リポジトリへのパス--depth=immediates or infinity
  • リビジョンを指定するなら -rを使う
svn checkout -r 2 リポジトリへのパス
  • リポジトリパスはhttpなら通常のURLと一緒。
  • ローカルのリポジトリから取得
svn checkout file:///home/svn/repos/

今のリポジトリ状態をチェック

svn st

追加や修正のあったファイルの状態を表示できる。

リポジトリを最新化

  • 更新したいディレクトリに移動
svn up

リポジトリを特定のリビジョンに戻す

svn logしてバージョンを特定し
svn up -r XXX

コミット

svn commit もしくは svn ci

変更の取り消し

svn revert
  • コミットしてしまった場合はマージすることになる。
merge --depth=infinity -r取り消したいリビジョン番号:左より-1のリビジョン リポジトリURL 適用するチェックアウトディレクトリー

ログを見る

svn log --revision リビジョン番号 リポジトリURL
  • そのリビジョンでコミットされたファイルを取得
svn log -r リビジョン番号 -v

ファイルに保存された認証情報を消す

rm -rf ~/.subversion/auth/svn.simple/*

他のプロジェクトのソースを参照する(externals)

シンボリックリンクのようなもの。メインは別のリポジトリで開発していてそこを参照したい場合に設定する。参照オンリーではなくコミットまで出来てしまう点は注意。以前はフォルダ単位でしかできなかったが、1.6以降ファイル単位も可能になった。

TortoiseSVN設定

属性の設定を選んで、属性名はsvn:externalsを選ぶ。

設定値はファイル単位で記述、絶対パスでも可能

../../../../../../../404.html 404.html
../../../../../../../500.html 500.html

マージ

よく混乱してしまうのがマージである。基本的にブランチで枝分かれしない限りは必要ないのだが。

マージの方法

  1. マージ先のプロジェクトをチェックアウト(マージ元はリポジトリから取得するのでチェックアウトが不要)
  2. マージしたい変更のリビジョンのみを指定して、マージ実行
  3. 変更点を確認するのと、merge-infoプロパティに指定したリビジョンが追加されていることを確認してコミット
  • リビジョン指定してコミット
cd マージされる側のワーキングコピー
svn merge -c 305212,305357,305716,305867,305962,306151,306370 http://host/マージ取得元のURL

TIPS

サーバー移転

サーバの情報が記述されているメタ情報(.svn)を書き換える必要がある。通常はsvnのコマンドで行う。GUI使ったほうが楽かも

svn switch --relocate

ブランチ切り替え

svn switch 新URL

ローカルチェックアウトディレクトリ移転

これはトップレベルフォルダを移動するだけで良い。一旦チェックアウト後そのディレクトリをプログラム実行場所まで移動してもメタ情報は相対パスで記述されているので大丈夫

リビジョン間の差分をチェック

リポジトリ同士の比較

  • リポジトリ1のリビジョン1000とリポジトリ2のheadを比較する
svn diff リポジトリ[email protected] リポジトリ[email protected] 
  • とあるリポジトリのリビジョン間(1000-2000)の差分を表示
svn -r 1000:2000 リポジトリ1URL

最後に--summarizeをつけるとファイルの出力のみとなる

チェックアウトディレクトリとリポジトリの差分をチェック 基本

  • ワーキングディレクトリーに移動して以下のコマンドを実施
svn diff -r77771:head [ワーキングディレクトリ名]

移動しない場合は引数で指定可能

共通ファイル名だけを抽出する

--summarizeオプションを付けるとファイル名のみ出力
svn diff -r77771:head --summarize [ワーキングディレクトリ名]

設定など

Apacheと連携して使う

  • CentOS5.4で検証。まずはsvnモジュールのインストール
yum install mod_dav_svn.
  • 次にhttpd.confの設定
  • IPアドレス制限とBASIC認証をかけている
<Location /mysvn>
 DAV svn
 SVNParentPath "/home/svn"
 SVNListParentPath on
 deny from all
 allow from xxx.xxx.xxx.xxx
 AuthType Basic
 AuthName "Rutake Repository"
 AuthUserFile /etc/httpd/conf/.htpasswd
 Require valid-user
</Location>
  • リポジトリの以下のディレクトリに書き込み権限を与えておく。与えないと「can't open activity db」などのエラーがでる。
    mkdir /home/svn/repos
    svnadmin create /home/svn/repos
    chown -R apache:apache /home/svn/repos

認証情報のおき場所

Unix 系システムでは~/.subversion/auth/、 Windows であれば %APPDATA%/Subversion/auth/

一度認証に成功するとそのID/PASSWORS情報がキャッシュされる。別のユーザでコミットしたい場合はそのファイルを消さないと前回成功したユーザIDでコミットされてしまう。

コマンドラインオプション中で--username または--passwordを指定するとそちらが優先して利用される。

ネットワーク越しの利用

httpを使わない場合はsvnプロトコルを利用するのがシンプル。ローカルマシン以外はデーモン起動する必要がある。

デーモンとして起動(3690ポートを利用)

svnserve -d -r リポジトリへのパス

/etc/rc.d/rc.localにでも記述しておけば自動起動になる。

xined経由で起動(安全)

参考URL

# vi /etc/services
svnserve        3690/tcp                        # Subversion
svnserve        3690/udp                        # Subversion
# vi /etc/xined.d/svnserve
service svnserve
{
   disable = no
   socket_type = stream
   protocol = tcp
   wait = no
   user = root
   server = /usr/local/bin/svnserve
   server_args = -i
}
# chkconfig --add svnserve
# /etc/init.d/xinetd restart

Windowsから利用する

  • TortoiseSVNというソフトがエクスプローラーの拡張でインストールでき秀逸な出来。

TortoiseSVNの使い方

エクスプローラーの拡張シェルとしてインストールされる。開発も活発なのでこれを選択しておけば安心。日本語パッケージをインストールしないとコミットコメントに日本語が使えないので注意。

TSVNCache.exeが重い時

デフォルトでは全てのドライブの更新を監視しているため、そりゃー重いだろう。設定でアイコンオーバーレイを無効にするか、監視ドライブを限定すること。

Can't convert string from native encoding to 'UTF-8'

ターミナルのセッティングが英語で日本語を含むものを落とす時に発生する。

Subclipseの使い方

こちらはEclipseプラグイン。

コマンドラインで使う

リポジトリ一覧見る

  • 指定したパス以下のファイル・ディレクトリ情報が表示される。
svn list svn://ホスト名/svn/repos

デフォルトの書き込み制限解除

リポジトリのルートのconf以下のファイルを変更
  • 特定のユーザーのみ書き込み可能にする場合
[general]
password-db = passwd
  • 誰でも書き込めるようにする場合
[general]
anon-access = write
auth-access = write
認証に関しての情報が少なすぎ!!!
httpの場合はmod_svn_authzというモジュールを組み込まないと素通りできる

BACKUP&RECOVERY

  • 設定ファイルは別途バックアップ必要。出力はテキストファイルなのでとても大きい。この後圧縮かけると良い
svnadmin dump /usr/local/takeru > takeru.out
#一気に圧縮する
svnadmin dump /usr/local/takeru | gzip > takeru.out.gz
  • リカバリーはリポジトリを作成後dumpを流し込む
mkdir -p /usr/local/takeru_from_backup
svnadmin create /usr/local/takeru_from_backup
svnadmin load /usr/local/takeru_from_backup < takeru.out
  • 設定ファイルのコピー
SVNROOT/confディレクトリ以下をごっそりコピーすればよい。
  • ダンプするときに一部除外する(GPSデータを除外するときに利用)
svnadmin dump /home/svn/repos | svndumpfilter exclude 除外したいパス(/GPS) > /var/tmp/svnbackup
  • 複数も行ける
svnadmin dump /home/homesvn/repos | svndumpfilter exclude /trunk/GPS/ /trunk/MUSIC/ > slimsvn

疑問点:excludeのパスはフルパスというか前方一致

  • 日付つきでバックアップ
svnadmin dump /home/svn/repos >  svn_rep_backup_`date +%Y%m%d`
  • リポジトリを変えた場合はクライアント側でリポジトリのrelocateを行う。
    cd リポジトリのワーキングコピー
    #URL情報取得
    svn info | grep URL
    svn sw --relocate 旧URL 新URL
    

自宅サーバでの移行作業記録

  • 移行元(リポジトリは/home/svn/reposとする)
svnadmin dump /home/svn/repos > /var/tmp/repos.out
# 圧縮してもOK
svnadmin dump /home/svn/repos | gzip > /var/tmp/repos.out.gz
  • 移行先
mkdir -p /home/svn/repos
svnadmin create /home/svn/repos/

ここまではリポジトリ作成と同じ手順

svnadmin load /home/svn/repos < /var/tmp/repos.out

流し込むのでそれなりに時間がかかる

コマンド一覧

リポジトリは/svn/repos

リポジトリ初期化(ディレクトリは作成しておく)svnadmin create /svn/repos/
リポジトリを見るsvn list file:///svn/repos
インポートsvn import [ローカルdir] http://localhost/svn/repos/[リポジトリdir]
ローカルでインポートsvn import file:///svn/repos/newrepos
チェックアウト(通信方式(file,svn,http)が.svn/entriesにかかれる)svn co file:///svn/repos
diffチェックsvn diff [ファイル名]
ブランチ、トランク間のdiffsvn diff [email protected] [email protected]grep "+++"
プロンプトを出さない(マージの時に衝突のプロンプトを無視したいとか)--non-interactive

ブランチ作成

タグもコピー先のディレクトリがtags以下にするという慣例を除けばコマンド自体は一緒。

svn copy http://example.com/svn/trunk http://example.com/svn/branch/new

ブランチ分かれてからのログ取得

svn log --stop-on-copy [url]

用語集

trunkメインとなるリポジトリ
branchtrunkから枝分かれしたもの(branchは枝の意味)
tagある時点のソースに名前を付けてスナップショットにできる。subversionではtagに対してもコミットできてしまうのであるが、そういう運用はしないこと!
commitローカルにある変更をリポジトリに反映すること

WebUI

ViewVCというのがある。

インストール

RPMインストールでさまざまな依存関係があるので公式サイトからごっそり関連RPMを持ってくるとよい。DebianやVineならaptが使えるので非常に楽

バイナリからインストール(推奨)

下記ソースインストールは2004年の情報で今はバイナリがあることがほとんどなのでこちらを推奨する。

ソースインストール(非推奨)

RedHatES3GUIインストールサーバータイプで開発ツールのみ選択した。

db

# cd biuld_unix
# ../dist/configure

apache

# ./configure --enable-mods-shared=all --enable-shared=yes --with-berkeley-db=/usr/local/BerkeleyDB.4.2

subversion

# ./configure --with-apr=/usr/local/apache2 --with-apr-util=/usr/local/apache2 --with-berkeley-db=/usr/local/BerkeleyDB.4.2
ですべて問題なく。
  • 追記:apr-utilなどはソースに含まれているので./configureだけでOK

外部リンク情報

http://c-brains.jp/blog/wsg/09/11/17-143618.php

Subclipseでのトラブルシューティング

[working copy at a single revision]とでて何も出てこない。

 →ワーキングディレクトリを更新すればよい

Counter: 16796, today: 2, yesterday: 1

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-03-10 (木) 23:11:09