Subversion(バージョン管理システム)メモ †
- Git知っている人がSubversionを使う場合の記事
revert: コミット前の変更を戻す †
- "M" マークが付いたファイルの変更を元に戻す
- 再帰的に全ての変更を元に戻す
svn revert -R .
リポジトリサイズ縮小 †
- 古いsvnからdump -> 新しいsvnへrestoreでも多少サイズが減る。リポジトリのdump/create/load後のサイズ
- svn 1.7 => 1.8
svn version | repo MB |
1.7 | 1216 |
1.8 | 1206 |
- svn 1.8 => 1.9
svn version | repo MB |
1.8 | 1347 |
1.9 | 1199 |
svnsync: リポジトリミラー(同期) †
- svnsync
- svn1.4以上
- リモートのsvnリポジトリとローカルのsvnリポジトリを同期する。
- リモートリポジトリのread権限があれば良い
- dump/loadより早い
svnadmin create /var/www/svn/repos
svnsync init file:///var/www/svn/example http://svn.example.com/repos
svnsync sync file:///var/www/svn/repos
Subversion 1.8/1.9のインストール †
- CentOS 6/7
- 古いバージョンは削除
sudo yum remove subversion
sudo rm /etc/yum.repos.d/WANdisco-1.7.repo
- インストール
dist_ver=$(grep -o -P "\d" /etc/redhat-release | head -n 1)
svn_ver=1.9
ARCH=$(uname -i)
sudo bash -c "cat > /etc/yum.repos.d/subversion.repo << 'EOS'
[subversion]
name=Wandisco SVN Repo
enabled=1
baseurl=http://opensource.wandisco.com/rhel/$dist_ver/svn-${svn_ver}/RPMS/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-WANdisco
EOS"
sudo rpm -import http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
sudo yum install subversion-perl.$ARCH subversion.$ARCH subversion-devel.$ARCH mod_dav_svn.$ARCH subversion-python.$ARCH
svn --version
svn, version 1.9.5 (r1770682)
- httpd再起動
sudo cp /etc/httpd/conf.d/subversion.conf /etc/httpd/conf.d/subversion.conf.rpmnew
sudo cp /etc/httpd/conf.d/subversion.conf.rpmsave /etc/httpd/conf.d/subversion.conf
sudo /sbin/service httpd restart
- Ubuntu 12.04 LTS
sudo sh -c 'echo "# WANdisco Open Source Repo" >> /etc/apt/sources.list.d/WANdisco.list'
sudo sh -c 'echo "deb http://opensource.wandisco.com/ubuntu precise svn19" >> /etc/apt/sources.list.d/WANdisco.list'
wget -q http://opensource.wandisco.com/wandisco-debian.gpg -O- | sudo apt-key add -
sudo aptitude update
sudo aptitude install subversionsvn --version
svn, version 1.9.7 (r1800392)
色つきdiff †
brame:誰が行を変更したのかを探す †
diff:差分 †
# 一つ前と最新を比較
svn diff -r PREV:HEAD sample.txt
# チェックアウトした時点と最新を比較
svn diff -r BASE:HEAD sample.txt
# 明示的にリビジョンを指定して比較
svn diff -r 100:110 sample.txt
# 日付の範囲を指定して比較
svn diff -r {2012-9-1}:{2012-9-2} sample.txt
チェックアウトしたリビジョン番号の取得 †
初回チェックアウト時の認証の自動化 †
svn checkout --username user --password pass https://svn.example.com/svn/trunk/yourproject >logfile 2>&1 <<EOS
p
yes
yes
EOS
CentOS5.x/6.xにSubversion1.7をインストール †
- Subversion 1.7の良くなった所
- 作業ディレクトリのトップだけに.svnが作られるようになった
- HTTPv2対応
- パフォーマンス改善
- svn log --diff
- svn diff --git
- svn patch
- svn relocate
- 自動で行う場合
- 手動で行う場合
- 既存環境をダンプ
svnadmin dump /path/to/svn_repos > svn_repos_backup_file
- 既存環境を確認
rpm -qa | grep subversion
subversion-1.6.11-7.el5_6.4
subversion-1.6.11-7.el5_6.4
rpm -qa | grep svn
mod_dav_svn-1.6.11-7.el5_6.4
- アンインストール
yum remove subversion mod_dav_svn
- リポジトリ追加
cat > /etc/yum.repos.d/WANdisco-1.7.repo << 'EOS'
[WANdisco-dev]
name=WANdisco SVN Repo 1.7
enabled=0
baseurl=http://opensource.wandisco.com/centos/5/devel/RPMS/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-WANdisco
EOS
rpm -import http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
- インストール
ARCH=`uname -i`;yum install --enablerepo=WANdisco-dev subversion-perl.$ARCH subversion.$ARCH subversion-devel.$ARCH mod_dav_svn.$ARCH subversion-python.$ARCH
- httpdの再起動
cp /etc/httpd/conf.d/subversion.conf /etc/httpd/conf.d/subversion.conf.rpmnew
cp /etc/httpd/conf.d/subversion.conf.rpmsave /etc/httpd/conf.d/subversion.conf
service httpd restart
Androidの無視設定 †
ファイル名変更で502 bad gateway †
バグ予測 †
ドットファイルがコミットできない場合 †
一括してファイルの追加、削除を行う †
cat >> ~/.bash_profile << 'EOS'
alias svndel="svn st | grep '^!' | sed -e 's/\![ ]*/svn del /g' | sh"
alias svnadd="svn st | grep '^?' | sed -e 's/\?[ ]*/svn add /g' | sh"
EOS
. ~/.bash_profile
svnadd
svndel
Unsupported working copy format †
gitと併用する †
複数の属性を付ける †
.svnディレクトリ以外を列挙 †
sshポートフォワーディングを利用する †
実行属性を付ける †
svn:executableを付ければ、環境に応じて実行属性を付けてくれる。
Windows上でチェックアウトした場合は無視される。
ファイルのみ有効。ディレクトリに設定しても効果は無い。
ファイル名の文字コード †
もし、他のLinuxサーバにチェックアウトしたファイルを置く場合は、ファイル名はutf8が良さそうです。
Windowsの場合はSJIS, Linuxの場合は環境変数のLANGにより自動的に変換されます。
$ locale -a | grep ja
ja_JP.eucjp
ja_JP.sjis
ja_JP.utf8
各ブラウザでの対応状況が違うようで、文字コードによってダウンロードされるファイル名が%??になったります。
| | | sjis | | eucjp | | utf8 | |
| IE6 | | NG | | NG | | ブラウザNG。ダウンロードOK | |
| Firefox2 | | OK | | OK | | OK | |
| Opera9 | | ブラウザOK。ダウンロードNG | | ブラウザNG。ダウンロードOK | | ブラウザNG。ダウンロードはOK | |
ftpで.svnディレクトリを除外して同期したい時 †
".svn"を除外したファイル一覧 †
svnファイルのパーミッション変更 †
svn ls -R | grep /$ | xargs chmod 705
svn作業ディレクトリのパーミッションを変更する †
うっかりrootで作業すると、.svnディレクトリのパーミッションもrootになり、
他のユーザでコミット時に Permission denied になります。
その変更を元に戻します。
find . -name ".svn" | xargs chown -R 一般ユーザ:グループ
コミットログ変更時にメールを飛ばす †
- hooks/以下にスクリプトを以下のスクリプトを配置して、実行権限を与える。
$ cd ${REPOS}/hooks/
$ chmod 755 post-revprop-change revprop-change-email.rb
コミットログの変更 †
cvsリポジトリの変換 †
もし、変換中にRCSファイルでエラーが出て停止する場合は、RCSファイルを消せば良い。
cvs2svn --encoding=EUC-JP
コミット前のソースをexport †
TortoiseSVNならば、チェックアウト状態のディレクトリからexport可能。
.svnディレクトリを除いたファイル・ディレクトリが出力される。
- チェックアウトしたディレクトリ上で、右クリックしTortoiseSVN
- 「エクスポート」で出力先を指定
tagの作成 †
リリースしたものをtagsに入れる。
「rel-日付」や「rel-バージョン」とするのがわかりやすいかも。
- TortoiseSVNの場合
- ログを表示
- リビジョンからタグを生成
- コピー先にtags以下を指定
https://.../svn/SandBox/tags/rel-20070213
svn:ignoreとワイルドカード †
svn:ignoreで*と*.*の挙動。
- *.txtと*.TXTを無視したい場合
*.[tT][xX][tT]
- .fooとfooファイルを作成
$ touch .foo
$ touch foo
$ touch foo.dat
- *
$ svn propedit svn:ignore .
----
*
----
$ svn status
M .
- *.*
$ svn propedit svn:ignore .
----
*.*
----
$ svn status
? foo
M .
ソースからインストールしたsubversionをアンインストールする †
Makefileにはuninstallが定義されていないので手動で削除する。
# rm -Rf /usr/local/man/man1/svn*
# rm -Rf /usr/local/man/man1/neon-config*
# rm -Rf /usr/local/info/svn*
# rm -Rf /usr/local/bin/neon-config
# rm -Rf /usr/local/bin/svn*
# rm -Rf /usr/local/lib/libsvn_*
外部ライブラリの取り込み †
バックアップ/リストア †
- 「/var/www/svn/」にある複数リポジトリを「./svn_dump/」にダンプ
- 「./svn/」に新しいリポジトリを作成
- 「./svn/」にダンプしたデータをインポート
svn_src=/var/www/svn
svn_dump=./svn_dump
svn_dest=./svn
# dump
for p in $(find $svn_src -maxdepth 1 -mindepth 1 -type d); do \
echo "-- $p"; \
[[ ! -f "$svn_dest/$(basename $p).$(date +%Y%m%d).gz" ]] && svnadmin dump $p | gzip > $svn_dump/$(basename $p).$(date +%Y%m%d).gz; \
done
# create repo
for p in $(find $svn_src -maxdepth 1 -mindepth 1 -type d); do \
echo "-- $p"; \
[[ ! -d "$svn_dest/$(basename $p)" ]] && svnadmin create --fs-type=fsfs $svn_dest/$(basename $p); \
done
# load
for p in $(find $svn_src -maxdepth 1 -mindepth 1 -type d); do \
echo "-- $p"; \
[[ -d "$svn_dest/$(basename $p)" ]] && zcat $svn_dump/$(basename $p).$(date +%Y%m%d).gz | svnadmin load $svn_dest/$(basename $p); \
done
Subversionリポジトリの統合 †
複数のリポジトリを1つに統合します。
ただし、tracのコンテンツの統合は難しそう。
- 統合するリポジトリのダンプファイルを作成する
svnadmin dump /repository1-path | gzip > repo1.gz
svnadmin dump /repository2-path | gzip > repo2.gz
- 統合先リポジトリを作成する
svnadmin create --fs-type=fsfs /new-repository-path
- 統合先リポジトリに統合されるリポジトリのファイルを格納するためのディレクトリを、各々一つずつ作成する
svn co file:///new-repository-path
svn mkdir path-to-dir1-for-repository1
svn mkdir path-to-dir2-for-repository2
svn commit -m "message"
- dumpした統合対象リポジトリを、各々のために用意したディレクトリにロードする(--parent-dir付き)
zcat repo1.gz | svnadmin load /new-repository-path --parent-dir path-to-dir1-for-repository1
zcat repo2.gz | svnadmin load /new-repository-path --parent-dir path-to-dir2-for-repository2
- リポジトリのリカバーを実行する
svnadmin recover /new-repository-path
- tracも使用している場合は、同期を取る。
trac-admin /trac-repository-path resync
コミットログもちゃんと引き継がれます。
デフォルト構成リポジトリ作成スクリプト †
- スクリプト
svn-scripts.zip
※編集し、各環境に合わせる事
- デフォルト構成リポジトリ作成
./svn-create.sh プロジェクト名
- ユーザ追加
./svn-adduser.sh ユーザ名
リビジョン間の差分をエクスポートする †
- TortoiseSVNのメニューから「ログを表示」
- 2つのrevisionを選択する
- 右クリックして「リビジョンを比較」
- リストのすべてのファイルを選択する(CTRL+A)
- 「選択をエクスポート」で保存先フォルダを選択
同様に「選択ファイルのリストを保存」だと、ファイル名一覧を保存できる(Unicode)
svn copyとコミットログ †
TortoiseSVNのデフォルトでは、svn copyや svn rename したファイルのログが表示されない。
ログ表示ウィンドウの「コピー/名前の変更」チェックを外すと表示されるようになる。
アクセス制御を行う †
- tagsディレクトリはコミット不可(commit-access-control.pl)
- コミットログが空白の場合、コミットさせない(pre-commit)
- etc
- デフォルトのpre-commit スクリプトをコピー
cp ${REPOS}/hooks/pre-commit.tmpl ${REPOS}/hooks/pre-commit
- ソースからcommit-access-controlをコピー
cp /usr/share/doc/subversion-1.2.1/tools/hook-scripts/commit-access-control.pl ${REPOS}/hooks/commit-access-control.pl
cp /usr/share/doc/subversion-1.2.1/tools/hook-scripts/commit-access-control.cfg.example ${REPOS}/hooks/commit-access-control.cfg
- 実行権限を与える
$ chmod +x pre-commit commit-access-control.pl
- commit-access-control.cfgを編集してアクセス制御を行う
コミット時にメールを飛ばす&該当チケットのクローズ †
- 設定
- リポジトリ毎にフックスクリプトを設定します。
- ${REPOS} は該当リポジトリのパスに読み替えて下さい。
- デフォルトのpost-commit スクリプトをコピーして編集します。
post-commit
cp ${REPOS}/hooks/post-commit.tmpl ${REPOS}/hooks/post-commit
- tracのスクリプトもコピーします。
trac-post-commit-hook
cp src/trac-0.9.3-ja-1/contrib/* ${REPOS}/hooks/
- email送信スクリプトも同じディレクトリに配置し、内容を編集します。
email-send.rb
${REPOS}/hooks/email-send.rb
- スクリプトに実行権限を与えます
$ chmod +x post-commit trac-post-commit-hook email-send.rb
copyやmoveでワイルドカードを使う †
エクスポート時に強制的に改行コードを指定する †
Word,Excel,PowerPoint,PDFの文書も比較する †
- xdocdiff
TortoiseSVNでWord, Excel, PowerPoint, pdfのdiffを見れるようにするツール。
内蔵差分ビューアだと文字化けする(UTF-8しか対応してないため?)ので他の差分ツールを使うのがよさそう。
- 文字化け

- WinMerge
- TortoiseSVNでの設定箇所

- これで表示した場合

ブランチの作成 †
- Subversionでは、リポジトリツリーの一部または全体をコピーすることができる。コピーしたリポジトリツリーをブランチとみなす。
タグの作成 †
- Subversionでは、「タグをつける」という機能そのものはない。かわりにブランチをひとつ作成し、これに変更を加えないことで、タグとみなしている。
一般的なリポジトリレイアウト †
- Subversion:一般的なリポジトリレイアウト
trunk/ | 主系。 プロジェクトの主な開発が行われるディレクトリ |
---|
branches/ | 変更を別の開発ラインに分離する。安定したら主系にマージする。 一つの開発の流れが、もう一方と独立して存在しているが、 もし過去にさかのぼれば、同じ履歴を共有している |
---|
tags/ | 特定のリビジョン (たとえば、リリースリビジョン)に印をつける事。 プロジェクトの「スナップショット」 |
---|
sandbox/ | お砂場。テスト用 |
---|
一般的なプロジェクトディレクトリツリー †
SAMPLE
└─trunk
│ README プロジェクトを説明する短い文章
│ BUILDING ビルド方法
│ GLOSSARY プロジェクト固有の専門用語
│
├─data データファイル等
├─db データベース関係
├─doc ドキュメント類
├─src プログラムソースコード
├─util ユーティリティプログラム
├─vendor サードパーティ製ライブラリやヘッダファイル
└─vendorsrc サードパーティ製ソースコード
特定ディレクトリ以下の複数の Subversion リポジトリを公開する場合 †
現在の設定されている属性を表示する †
svn -v proplist *.php
svnにパスワードを保存させない †
共有アカウント等で最初の一人がコミットするとパスワードが保存されるため、他の人のコミットも最初の人の名前になって区別が付かなくなる。
毎回パスワードを入力させるように変更する。
# コメントアウトされている場合は外す
vi ~/.subversion/config
----
[auth]
...
store-passwords = no
store-auth-creds = no
----
# 認証済み情報削除
rm -f ~/.subversion/auth/svn.simple/*
エディタを指定する †
$ vi ~/.subversion/config
------
[helpers]
...
editor-cmd= /usr/bin/vim
svn:mime-type自動属性設定 †
拡張子に応じて「svn:mime-type」を自動で設定できる。
ただし、クライアント毎に設定が必要
svn-config
- Linux
- Windows
- TortoiseSVN -> 設定 -> 一般 -> 編集