Top / Subversion / TIPS集

HTTPの代わりに、SSHを使う

SubversionはApacheなどWEBサーバを用いてHTTPでアクセスする方法のほかに、SSHを用いてアクセスすることもできます。すでにSubversionが稼働しているサーバにはSSHログインが可能な環境だとして、アクセスするURLを

svn+ssh://[アカウント名]@[サーバ名]/opt/svnroot/fugafuga/

とすればOKのようですね。んーでもアクセス制御とかはようわからんなあ。また、

  • HTTPS+Digest認証によるアクセス
  • SSHを用いたアクセス

どちらがよりセキュアなんですかね??

匿名ユーザならチェックアウトのみ、匿名でなく(たとえばDigest認証済みのユーザとか)かつSSLならコミットOKっていう設定。

きのの、まずはやってみる

複数のリポジトリを公開したい

サーバ上に

/opt/svnroot1
/opt/svnroot2

というSVNのリポジトリ*1があるとします。

<Location "/svn">
  DAV svn
  SVNParentPath /opt
</Location>

とhttpd.confに書いておくことで、

http://[サーバ名]/svn/svnroot1/
http://[サーバ名]/svn/svnroot2/

というURLでそれぞれのリポジトリにアクセス可能です。

ディレクトリごとにアクセス制御する

あるサーバ内で複数のリポジトリやtrunk,branches,tagsなど複数のディレクトリをあつかっているときの、ディレクトリごとのアクセス制御方法です。

httpd.confで

<Location "/svn">
  DAV svn
  SVNParentPath /opt
  AuthzSVNAccessFile /opt/hogehoge/dav_svn.authz
  AuthName "Subversion repository"
  AuthType Basic
  Require valid-user
  AuthUserFile /opt/hogehoge/.htpasswd
</Location>

などと書いておき、dav_svn.authz で

[groups]
developer = dev1

[/trunk]
@developer=r

としておきます。

そうすると

http://[サーバ名]/svn/svnroot/trunk/     :dev1で読み可能
http://[サーバ名]/svn/svnroot/branches/  :読み書き不可
http://[サーバ名]/svn/svnroot/tags/      :読み書き不可

となります。

[/trunk] はリポジトリ名指定もできます。

[svnroot1:/trunk]
@developer=r

などと書けば

http://[サーバ名]/svn/svnroot1/trunk/     :dev1で読み可能
http://[サーバ名]/svn/svnroot1/branches/  :読み書き不可
http://[サーバ名]/svn/svnroot1/tags/      :読み書き不可
http://[サーバ名]/svn/svnroot2/trunk/     :読み書き不可
http://[サーバ名]/svn/svnroot2/branches/  :読み書き不可
http://[サーバ名]/svn/svnroot2/tags/      :読み書き不可

となります。

たとえば

  • 全てのユーザはtrunk,branches,tagsを読み可能
  • admin1は何でもできる
  • dev1はtrunk,branchesに書き込みも可能(tagsにはコミットできない)
  • tester1,tester2はコミット不可能

などとしたい場合は以下のようにしておきます。

[groups]
admin = admin1
developer = dev1
tester = tester1,tester2


#基本的に誰でも読みは可能
#adminは読み書き可能
[/]
* = r
@admin = rw

#さらにdeveloperはtrunkを読み書き可能
[/trunk]
@developer = rw

#さらにdeveloperはbranchesを読み書き可能
[/branches]
@developer = rw

subversionの".svn"を削除するワンライナー

uthorofotus irucというサイトに載ってました。

$ rm -rf `find ./ -type d -name .svn ! -regex \.svn/. -print`

なるほどー。

Eclipseでブランチを作る

SVN管理しているEclipseプロジェクト上で「チーム >> ブランチ」を選択します。

eclipse.gif

ブランチが作成されました。

viewvc.gif

確かに作成されていますね。

ブランチからマージする。

Branchでいくらか開発が進捗して、その差分をTrunkにマージする方法です。考え方としては

  • ブランチが作られた(枝分かれした)時点から直近まで、のブランチの変更内容を抽出し
  • Trunkのワーキングコピーにその差分を反映
  • Trunkにコミット となります。

まずはTrunkをcheckoutしてきたEclipseプロジェクトで「チーム >> マージ」を選択します。 表示されるダイアログで、URLをブランチのURL、Start Revisionを枝わかれしたときのリビジョン、Stop RevisionをHeadにします。

merge.gif

これでブランチを作成したときから今までのブランチの変更が、トランクのワーキングコピーに反映されました。後はコミットすればOKです。

キーワード置換

CVSにもあるヤツ。ファイルごとに指定する方法は分かったんだけどデフォルト設定する方法がまだ不明。

とりあえずファイルごとに指定するには

bash-3.2$ svn propset svn:keywords Id hoge.txt
property 'svn:keywords' set on 'hoge.txt'
bash-3.2$ svn proplist -v hoge.txt
Properties on 'hoge.txt':
  svn:keywords : Id
bash-3.2$

でコミットすればOK。Idは置換されるようになります。

http://hrgs.xrea.jp/2006/12/23/subversion_auto_props にあるのですが、svnは

~/.subversion/config

でクライアント側の設定を行うようです。でこのファイルに

enable-auto-props = yes
*.java = svn:keywords=Id

としておけば、新規作成時に自動的に上のコマンドが実行されます。ただ新規の時だけで、コミット時は適用されないようです。

Subversiveでは

pref.png
keyword.png

複数キーワードを指定する場合。

で設定できます。

一度に設定を追加するワンライナー

svn propset svn:keywords Id `find ./ -name *.java`

ちなみに複数セットする場合は

svn propset svn:keywords "Id Revision" `find ./ -name *.java`

""で囲む必要があります。

ちゃんとセットされたかどうかは

svn proplist -v  `find ./ -name *.java`

で確認できます。

http://ukai.jp/debuan/2002w/subversion.txt のサイトにもっとエレガントなワンライナーがありました。$Idがあるやつだけにセットする、ってやりかたです。

svn propset svn:keywords Id 
  `find . \( -name .svn -prune \) -o -type f 
  -print | xargs grep -l '\$Id:'`   (実際は一行)

ちなみに -printはフルパス表示、-o はor検索、-type f はタイプがファイルのモノ、-pruneは除外、です。

http://subversion.bluegate.org/doc/ch07s02.html#id3065660

EclipseのクライアントSubversiveはキーワード部分の違いを無視してくれている?

SubversiveでクライアントをNative JavaHLで使ってるのですが、同期化をしたときに$Id$などの違いを無視してくれるようです。CVSではここが差分として出てしまうっていう問題があったのですが、$Id$内が異なってても差分として出てこないみたいです。

これはいいなー。。

コマンドの覚書

初回のチェックアウト

svn co http://hogehoge/trunk

とか

svn co http://hogehoge/trunk/project名

とか。

ファイルの追加

svn add *
svn commit

ちなみに svn add * はすでにバージョン管理下にあるディレクトリをとばしてしまうそうなので、ワーキングコピー内の全てのファイルをaddしたい場合は

svn add * --force

という--forceオプションを付ければOKです。

ファイルの更新

svn update

cvsでいうcvs -q -n*2 はどうすんのかな??

ワーキングコピーへの修正の確認

svn status

これでローカルで変更した内容が出力されます。ネットにはアクせずしないみたいです。よってもちろん他人の変更は表示されません。

修正内容の確認

svn diff

ファイルの削除

svn delete classes
svn commit

関連リンク


この記事は

選択肢 投票
おもしろかった 35  
そうでもない 5  
  • SVNParentPath? /opt としないで SVNPath /opt/svnrootなどとしてる場合も動きます。もちろん。 -- きの? 2007-06-11 (月) 01:54:26
  • svn diffしてて思ったんだけど、Subversionはキーワードを置換しないでリポジトリに保管されてるみたいですね。CVSだと置換してたけど。 -- きの? 2007-07-22 (日) 12:32:58
  • あれ、、タグ付けって、、、SVNリポジトリでやるんだっけ???プロジェクトからできないっけ? -- きの? 2008-01-19 (土) 08:47:14
  • ブランチの状態をタグ付けするときって、Branchのタグ(Branch_V1.0_hogehogeみたいな)を選択して、タグ付け、だっけ? -- きの? 2008-01-19 (土) 08:49:11

Top / Subversion / TIPS集

現在のアクセス:71869


*1 つまりたとえば svnadmin create /opt/svnroot1 とかしたってこと
*2 確認だけ。更新しない

添付ファイル: filekeyword.png 1177件 [詳細] filepref.png 1323件 [詳細] filemerge.gif 1608件 [詳細] fileviewvc.gif 1341件 [詳細] fileeclipse.gif 1425件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-09-15 (火) 23:48:12 (679d)