#author("2019-08-13T00:28:57+00:00","default:wikiadmin","wikiadmin")
#author("2022-03-10T14:11:09+00:00","default:wikiadmin","wikiadmin")
-CVSの後継。徐々にCVSを置き換えていてオープンソースプロダクトでは採用多数。2007年ぐらいから企業でも採用事例続々でてきた。2009年後半より自宅でも利用中

#contents

*特徴 [#o6d0e7f1]

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

*よく使うコマンド [#f2c7a102]

**属性の確認と設定 [#mdf4f206]

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


**svnからとってくる [#gdc26fc9]

-深さを指定しないと全部とってくる

 svn co リポジトリへのパス--depth=immediates or infinity

-リビジョンを指定するなら -rを使う

 svn checkout -r 2 リポジトリへのパス

-リポジトリパスはhttpなら通常のURLと一緒。

-ローカルのリポジトリから取得

 svn checkout file:///home/svn/repos/

**今のリポジトリ状態をチェック [#a7e3d1a6]

 svn st

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

**リポジトリを最新化 [#x96c837b]

-更新したいディレクトリに移動

 svn up

**リポジトリを特定のリビジョンに戻す [#ce11a6ba]
 
 svn logしてバージョンを特定し
 svn up -r XXX

**コミット [#b99c50e5]

 svn commit もしくは svn ci

**変更の取り消し [#n9c202b8]

 svn revert

-コミットしてしまった場合はマージすることになる。

 merge --depth=infinity -r取り消したいリビジョン番号:左より-1のリビジョン リポジトリURL 適用するチェックアウトディレクトリー

**ログを見る [#t06435ff]

 svn log --revision リビジョン番号 リポジトリURL

-そのリビジョンでコミットされたファイルを取得

 svn log -r リビジョン番号 -v

**ファイルに保存された認証情報を消す [#s6404960]

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

*他のプロジェクトのソースを参照する(externals) [#oeb36b1b]

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

**TortoiseSVN設定 [#i40061f7]

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

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

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

*マージ [#w80853f4]

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

**マージの方法 [#l23f6ac4]

+マージ先のプロジェクトをチェックアウト(マージ元はリポジトリから取得するのでチェックアウトが不要)
+マージしたい変更のリビジョンのみを指定して、マージ実行
+変更点を確認するのと、merge-infoプロパティに指定したリビジョンが追加されていることを確認してコミット

-リビジョン指定してコミット

 cd マージされる側のワーキングコピー
 svn merge -c 305212,305357,305716,305867,305962,306151,306370 http://host/マージ取得元のURL


*TIPS [#q7155123]

**サーバー移転 [#m577bfd9]

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

 svn switch --relocate

**ブランチ切り替え [#g22f1634]

 svn switch 新URL

**ローカルチェックアウトディレクトリ移転 [#m61b6617]

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

**リビジョン間の差分をチェック [#w614f97d]

***リポジトリ同士の比較 [#v07ba01f]

-リポジトリ1のリビジョン1000とリポジトリ2のheadを比較する

 svn diff リポジトリ1URL@1000 リポジトリ2URL@head 

-とあるリポジトリのリビジョン間(1000-2000)の差分を表示

 svn -r 1000:2000 リポジトリ1URL

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

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

-ワーキングディレクトリーに移動して以下のコマンドを実施

 svn diff -r77771:head [ワーキングディレクトリ名]

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

***共通ファイル名だけを抽出する [#fc8d660f]

 --summarizeオプションを付けるとファイル名のみ出力

 svn diff -r77771:head --summarize [ワーキングディレクトリ名]


*設定など [#i05d8d47]

**Apacheと連携して使う [#t198c7ea]

-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


**認証情報のおき場所 [#g62e85b1]

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

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

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

**ネットワーク越しの利用 [#jbf25cc2]

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

***デーモンとして起動(3690ポートを利用) [#f6765fed]

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

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

***xined経由で起動(安全) [#r085aa0b]

[[参考URL:http://yik.jp/wiki/svn_setting.html#l8]]


 # 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から利用する [#q8dc943c]

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

**TortoiseSVNの使い方 [#hb319e45]

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

**TSVNCache.exeが重い時 [#l1f989cc]

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

**Can't convert string from native encoding to 'UTF-8' [#wf5add6d]

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

**Subclipseの使い方 [#cf4ac129]

こちらはEclipseプラグイン。

**コマンドラインで使う [#safec12e]


***リポジトリ一覧見る [#f547b097]

-指定したパス以下のファイル・ディレクトリ情報が表示される。

 svn list svn://ホスト名/svn/repos

**デフォルトの書き込み制限解除 [#bc97634c]

 リポジトリのルートのconf以下のファイルを変更

-特定のユーザーのみ書き込み可能にする場合

 [general]
 password-db = passwd

-誰でも書き込めるようにする場合

 [general]
 anon-access = write
 auth-access = write

 認証に関しての情報が少なすぎ!!!
 httpの場合はmod_svn_authzというモジュールを組み込まないと素通りできる

*BACKUP&RECOVERY [#bf0671a3]

-設定ファイルは別途バックアップ必要。出力はテキストファイルなのでとても大きい。この後圧縮かけると良い

 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
 
**自宅サーバでの移行作業記録 [#q93a31e0]

-移行元(リポジトリは/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

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


*コマンド一覧 [#ob7a0c7c]

リポジトリは/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 [ファイル名]|
|ブランチ、トランク間のdiff|svn diff url@HEAD url@HEAD | grep "+++"|
|プロンプトを出さない(マージの時に衝突のプロンプトを無視したいとか)|--non-interactive|

**ブランチ作成 [#efed07e6]

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

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



**ブランチ分かれてからのログ取得 [#r6bb5de1]

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


*用語集 [#se615446]

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

*WebUI [#lbbd8365]

ViewVCというのがある。

*インストール [#hb6fee6f]

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

**バイナリからインストール(推奨) [#v327b17d]

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

**ソースインストール(非推奨) [#gedbfbfd]

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

**db [#t3d53b02]
 # cd biuld_unix
 # ../dist/configure

**apache [#k76f5d8c]
 # ./configure --enable-mods-shared=all --enable-shared=yes --with-berkeley-db=/usr/local/BerkeleyDB.4.2

**subversion [#h6001f1d]
 # ./configure --with-apr=/usr/local/apache2 --with-apr-util=/usr/local/apache2 --with-berkeley-db=/usr/local/BerkeleyDB.4.2

 ですべて問題なく。

-追記:apr-utilなどはソースに含まれているので./configureだけでOK

*外部リンク情報 [#k0782c08]

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

*Subclipseでのトラブルシューティング [#x6ef0d84]

 [working copy at a single revision]とでて何も出てこない。
 →ワーキングディレクトリを更新すればよい

#counter

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS