akkun_choi pedia
mindiaakkun_choi pedia見出し語

Subversion

akkun_choi · 2010-03-07 更新 · 4 ポイント

そろそろ整理したいな...

subversion
【名】
破壊、転覆

  • The planting of a bomb in the office was an act of subversion.

事務所に爆弾をしかけたのは、破壊行為だった。
http://eow.alc.co.jp/subversion/

クソCVSなんてSubversionしてやるぜ!ってことか
うっかり、海外で口走れないなw

推奨されるリポジトリ構成

CVSはブランチをやるとわけわからんようになるらしくてあまり使わない方がいいと言われている。Subversionではブランチ・タグは単純なファイルコピーでシンプルなのでバンバンやってよろしいらしい。

http://subversion.bluegate.org/doc/

CVSユーザのためのSubversion

削除されたファイルを復活する

Subclipseではできないっぽい?

http://subversion.bluegate.org/doc/ch04s04.html#svn.branchmerge.commonuses.resurrect

svn copy --revision 807 \
http://svn.example.com/repos/calc/trunk/real.c ./real.c

1.4と1.5ではフォーマットが異なる

svn: このクライアントは、作業コピー '.' を扱うには古すぎます。もっと新しい Subversion クライアントをダウンロードしてください。

なんと一度1.5のクライアントを使うと1.4に戻せないみたい!!

SubversiveクライアントSVNKITをdevelopmentにして、戻すと何故か起動直後に落ちるようになった。どうやらsvnのバージョンが原因みたい

ブランチをトランクにマージする方法

svn merge --dry-run -r 343:344 http://svn.example.com/repos/calc/trunk

このコマンドは作業コピーに/repos/calc/trunkの「343-344における変更点」だけを取り入れる。変更点の範囲を指定しないと、どこからどこまでなのかがわからないURLだけ指定できないのはこのため)

.svnを削除する

Windows
% for /R /D %I in (.svn) do RMDIR "%I" /S /Q
http://dev-e.sakura.ne.jp/wiki/wiki.cgi?page=.SVN%A5%D5%A5%A9%A5%EB%A5%C0%A4%F2%BA%EF%BD%FC%A4%B9%A4%EB
「*.svn」ではだめだったけど「.svn」ならいけた

Linux
% find /path/to/dir -type d -name '.svn' | xargs rm -rvf
http://kjirou.sakura.ne.jp/mt/2008/01/dirsvn.html

% rm -rf `find ./ -type d -name .svn ! -regex \.svn/. -print`
http://blog.triangle.jp/2007/11/svn.html

たぶんxargs使う方がいい?

ってかsvn exportなんてあるんだ!.svnファイルを生成せずにファイルだけ得られるみたいだ。

おまけ。そのフォルダ内の全ファイルを削除する svn コマンド
% svn status | awk '{print $2}' | xargs svn del
http://bitmap.dyndns.org/blog/archives/001521.html

別のリポジトリを同時に使いたい

root
 |
 |-config
 |
 |-application
 |
 |-library----vendor1 (別のリポジトリ)
      |
      --------vendor2(別のリポジトリ)

libraryにsvn:ignoreつけるだけでOK。libraryに直接別のリポジトリを置いても大丈夫かもね。
別リポジトリのupdate/commitが面倒だけど、同じものが複数のリポジトリにまたがるよりかはマシ。ってかそもそもリポジトリ設計が…(ry

外部定義

こういう別のレポジトリを配置する場合のやり方が標準で備わってました!!

上記の方法だとupdateが面倒。外部定義という方法を使えば、updateとstatusが別のリポジトリも同時にできる(commitは同時にはできないみたい)

やり方はプロパティ「svn:externals」に
「{directory_path} {repository_url}」を設定するだけ。

例えば、こういうリポジトリ構造の場合。

root
 |
 |--- application
 |
 |--- vendor
        |
        |---------- hoge
        |
        |---------- moge

hogehttp://repos/hoge、mogeはhttp://repos/mogeを使いたいという場合は

% svn propedit svn:externals vendor

これを実行するとエディタが起動するので以下を設定

hoge http://repos/hoge
moge http://repos/moge

マニュアルみるとディレクトリの指定は相対パスなのでvendorじゃなくてもrootでもいいみたい。また、バージョンも指定できるらしい

参考
http://www.mazn.net/blog/2008/07/07/98.html
マニュアル
http://subversion.bluegate.org/doc/ch07s05.html

リビジョン番号や更新者や日付をファイル内に自動で埋め込みたい

svn:keywords使ってファイルごとに使うキーワードを設定する。

でも、そんなこと普通はやってられないので自動プロパティ設定する。
クライアントのconfigファイルの[auto-props]ディレクティブに設定。

例えばphpだったらこんな感じ。

[auto-props]
*.php        = svn:eol-style=native; svn:keywords=Id Rev Date; svn:mime-type=text/x-php

ここにいい見本があった
http://code.google.com/p/symfony-doc-ja/wiki/SymfonyRepositoryTips

あとはファイル名に「$Id$」って書くだけ。
$Id$は「$Id: svntest.php 2462 2009-02-23 23:29:26Z akkun $」みたいなのに置き換わります。

svnプロパティで管理されるので、一度この属性がついたらどこでも有効になる。

WindowsでもCUIで使う

apache2.0
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91

apache2.2
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100&expandFolder=8100&folderID=8100

コミット時にメール送信

hooks/post-commitを変更するだけ。
スクリプトは自前で用意しないといけない。

これを使わせてもらった。
http://f29.aaa.livedoor.jp/~yamakan/index.php?LinuxSettingMemo%2F%A5%C7%A5%A3%A5%B9%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3%B6%A6%C4%CC%2FSVN%28Subversion%29%A5%B3%A5%DF%A5%C3%A5%C8%A5%E1%A1%BC%A5%EB%C0%DF%C4%EA

リポジトリの分割

http://blog.iwa-ya.net/2007/06/02/011048

結構簡単にできるね。ただ、今までの履歴に別のディレクトリからコピーとかしてると、それもimportしないといけないという…

ユーザごとにアクセス権限設定する(認可のオプション)

http://subversion.bluegate.org/doc/ch06s04.html#svn.serverconfig.httpd.authz

結構簡単にできる。apacheにはこれ設定するだけ

AuthzSVNAccessFile /path/to/access/file

設定ファイルaccess fileにはこういうのを定義。グループも設定できる。

[calc:/branches/calc/bug-142]
harry = rw
sally = r

svn COPY 502 bad gateway over HTTPS

ssl で svn copy はmod_davの制限上できない
http://www.digilib.org/modules/bwiki/index.php?Subversion#zca25176

コミットしたのに認識されない謎の現象

あるディレクトリにファイル数1000overをコミット
なぜかupdateとかinfoとかlogとかしてもそのディレクトリだけ反映されない。他のファイルはコミットしても反映される。
updateでなくcheckoutだったら更新できた。原因はわからん。

削除されたアイテムの復活

svn copy {url}@{revision} {path}

外部参照で相対パスにする

1.5から使える

1.4は DIR URL だったけど
1.5は URL DIR になる
http://www.asahi-net.or.jp/~iu9m-tcym/svndoc/svn_externals_relative.html

コマンド逆引き

ある期間の差分を得る

r2499からheadまでの変更。
通常は中身まで見るけど、--summarizeオプションでファイル一覧のみだけ出力

svn diff -r2499:head --summarize target

マージ

実行するなら--dry-runをはずす

# r2499からheadまでのfromにした変更をtoにもいれる
svn merge --dry-run -r2499:head from to

改行文字形式が一貫していません (Inconsistent line ending style)

ファイル中に違う改行コードを使ってる。統一させればOK。

関連する見出し語