Subversionの履歴

subversion
【名】
破壊、転覆

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

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

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

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

  • trunk : ここに流を入れる
  • branches
  • tags


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

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

CVSユーザのためのSubversion

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

Subclipseではできないっぽい?

http://subversion.bluegate.org/doc/ch04s04.html#svn.branchme...

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のバージョンが原因みたい

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

  • リビジョンを指定する。ブランチした時のリビジョンと適用したいリビジョンを指定
    • -dry-runするとマージ結果だけを教えてくれる

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%A...
「*.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/SymfonyReposito...

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

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

WindowsでもCUIで使う

apache2.0
http://subversion.tigris.org/servlets/ProjectDocumentList?fo...

apache2.2
http://subversion.tigris.org/servlets/ProjectDocumentList?fo...

コミット時にメール送信

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

これを使わせてもらった。
http://f29.aaa.livedoor.jp/~yamakan/index.php?LinuxSettingMe...

リポジトリの分割

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

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

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

http://subversion.bluegate.org/doc/ch06s04.html#svn.serverco...

結構簡単にできる。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#zc...

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

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

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

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