Subversion

Linuxがサーバ、macがクライアントとして使うという状況を想定しています。
vc-svn.plでvcが使いたいけど機能が足りないのでpsvn.plのほうで。というよりコマンドのほうが楽かも。
psvn.plはCarbon Emacsだと始めから入ってます。

mac用GUIversions

環境構築

subversion環境を作るときのメモ

Subversion Packages

サーバ側設定

とりあえず下ごしらえをインストール

$ sudo aptitude install subversion
$ sudo aptitude install subversion-tools
$ sudo aptitude install libapache2-svn

mod_dav_svnの設定

$ sudo emacs /etc/apache2/mods-available/dav_svn.conf
 
#下の部分のコメントアウトをはずす
<Location /svn>
  DAV svn
  SVNParentPath /var/lib/svn
 
  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /etc/apache2/dav_svn.passwd
 
  # 書き込みのみBasic認証を要求する場合
  <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  </LimitExcept>
 
</Location>

レポジトリ。新しいレポ作るときは下二行を繰り返し。

$ sudo mkdir /var/lib/svn
$ sudo svnadmin create /var/lib/svn/testrepo
$ sudo chown -R www-data:www-data /var/lib/svn/testrepo

Mac os X設定

windowsの設定わかんない。

$ sudo port install subversion +tools
$ svn --version
 
svn, バージョン 1.4.x (rxxxx)
   コンパイル日時: Dec xx xxxx, xx:xx:xx
 
Copyright (C) 2000-2007 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).
 
以下のリポジトリアクセス (RA) モジュールが利用できます:
 
* ra_dav : WebDAV (DeltaV) プロトコルを使ってリポジトリにアクセスするモジュール。
  - 'http' スキームを操作します
  - 'https' スキームを操作します
* ra_svn : svn ネットワークプロトコルを使ってリポジトリにアクセスするモジュール。
  - 'svn' スキームを操作します
* ra_local : ローカルディスク上のリポジトリにアクセスするモジュール。
  - 'file' スキームを操作します

リポジトリ作成

サーバ側
新しくsubversionのリポジトリを作成する

$ sudo svnadmin create /var/lib/svn/testrepo
 
$ sudo chown -R www-data:www-data /var/lib/svn/testrepo

プロジェクトを登録

もともとあったプロジェクトなんかをリポジトリに登録する場合に
クライアント側

$ svn import -m 'コメント' 'プロジェクトディレクトリ' 'リポジトリのパス'
$ svn import -m "test import" /usr/local/work/testproject https://xxx.co.jp/svn/testrepo
追加しています              /usr/local/work/testproject/file1.txt
追加しています              /usr/local/work/testproject/file2.txt
追加しています              /usr/local/work/testproject/file3.txt
リビジョン1をコミットしました

svn/testrepoの下にtestprojectディレクトリ内のファイルがコミットされる

$ svn import -m "test import" /usr/local/work/testproject https://xxx.co.jp/svn/testrepo/firstproject

だとfirstprojectディレクトリを自動で作ってそのなかにコミットされる
ここからチェックアウトする場合は一度ディレクトリを削除しなくちゃだめっぽいかもしれないかも

チェックアウト

$ svn checkout 'リポジトリのパス' '作業ディレクトリ'
$ svn checkout http://xxx.co.jp/svn/testrepo /usr/local/work/testproject

作業ディレクトリを指定しないとリポジトリのパス名の最後のディレクトリが作業コピーとして作成される。

普段の作業でよく使うコマンド

たぶん・・・
()のなかはEmacsのpsvnを使うときのコマンド。

変更点の調査 ( M-x svn-status )

とりあえずこれ。
Emacsではこの画面上でpsvnのコマンドを使う

$ svn status

作業コピーの更新 ( U )

毎朝やること。
他の人の変更とかも更新したり
画面の更新はg

$ svn update

変更点のコミット ( c )

作業の変更点をリポジトリに登録します。セーブみたいな。

$ svn commit -m "コメント"

ファイルを指定してコミットする場合

$ svn commit --file foo.m -m "コメント"

ファイル指定するときもうバージョン管理下にあるファイルを指定する場合は–force-logとする必要があります。

$ svn commit --file foo.m 
svn: Log message file is a versioned file; use '--force-log' to override
 
 
$ svn commit --force-log foo.m

ファイルの追加 ( A,a )

ファイルやフォルダを追加します。

$ svn add (file or directory)

この時点ではまだリポジトリには登録されていません。
コミットすることでリポジトリに反映されます。

ファイルの削除 ( D )

これもコミットするまでリポジトリに反映されません。

$ svn remove file

ファイルのコピー ( C )

コミットするまでリポジトリに反映されません。

$ svn copy "コピー元" "コピー先"

ファイルの移動 ( R )

コミットするまでリポジトリに反映されません。

$ svn move "コピー元" "コピー先"

履歴の確認 ( l )

なにもオプションを指定しないと全部表示する

$ svn log

一つのファイルやディレクトリも指定できる。URIでもおっけ

$ svn log file

リビジョンを1つだけ指定するとそのリビジョンのログを表示する

$ svn log -r 10

リビジョンを2つコロンで区切って指定すると2つのリビジョンの範囲を表示する

$ svn log -r 13:22

詳細な表示は-vをつける

$ svn log -r 10:20 file.txt -v

変更の差分の確認 ( = )

ローカルの変更内容の確認

引数なしで指定すると作業コピーの内容と、.svn 領域にキャッシュされている「修正元リビジョン」 のコピーとを比較する
psvnだとこっちだけしかできないかもしれませ

$ svn diff

作業コピーとリポジトリの比較

リビジョンを一つだけ指定すると、作業コピーとリポジトリの特定のリビジョンを比較する

$ svn -r 3 file

リポジトリとリポジトリの比較

リビジョンを2つコロンで区切って指定すると2つのリビジョンを直接比較する

$ svn -r 5:4 file

変更の取り消し ( r )

最後にコミットまたはアップデートした内容にもどす。

$ svn revert file1.txt

以前のリビジョンに戻す

リビジョン8から5に戻す場合

$ svn merge -r 8:5 https://xxx.co.jp/svn/testrepo
$ svn commit -m "Undoing change committed in r5."

個別のファイルだけ戻す場合は

$ svn merge -r 8:4 file1.txt
$ svn commit -m 'reverted to 4' file1.txt

ブランチ

コピー使うだけ。

$ svn copy 'コピーもと' 'コピー先'
 
#例
$ svn copy trunk branches/test_branch 
$ svn commit -m "branch"

タグ

これもコピーだけ。

$ svn copy 'コピーもと' 'コピー先'
 
#例
$ svn copy trunk tags/1.0-release
$ svn commit -m "tags 1.0-release"

除外するファイルやディレクトリを設定する(ignore)

たとえば一緒にmercurialでも管理していたときに.hgフォルダはsvnの管理から外したくなります。 そゆときに使います。

$ svn propset svn:ignore 対象ファイル 対象フォルダ

直下の.projectを除外対象にしたいとき。

$ svn propset svn:ignore .project .

.hg以下のファイルを全部対象外にしたいとき

svn propset svn:ignore '*' ./.hg

こうすると直下にある.hgはsvnの管理から除外されます。

いつでも除外したい物は ~/.subversion/configにある #[miscellany]とenable-auto-props = yesのコメントアウトをはずします。

...
[miscellany]
...
enable-auto-props = yes
...

で、さらにglobal-ignoresのコメントアウトもはずして除外したいものをつけたします。 

#global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store
 
コメントアウトを外して、.hgを付け加える。
 
global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store .hg

コンフリクト

コンフリクト(衝突)。 同じファイルの同じ行に違う変更があった場合updateだけじゃだめでcommitもできないため、
手作業で修正が必要になります。

例えばtext.txtでコンフリクトが発生した場合、発生した箇所で

........
<<<<<<< .mine
////自分の変更
=======
/////ほかの変更       
>>>>>>> .r209

みたいに衝突箇所を書いてくれてます。
それと下記の3つのファイルが作成されます。

  • filename.mine 更新する前の最後の作業コピー
  • filename.roldrev 作業コピーを変更する直前のリビジョン
  • filename.rnewrev 作業コピーを更新したときにリビジョンから受け取ったファイル

例えばこんなやつ

  • text.txt.mine
  • text.txt.r205
  • text.txt.r209

それらを見ながら手作業で修正します。
解決したらコンフリクトが解決したことをSubversionに教えます。

$ svn resolved test.txt
 
'test.txt' の競合状態を解消しました

一緒に3つのファイルも削除されます。
これでコミットできるようになります。

development_tool/vc/subversion.txt · 最終更新: 2009/09/19 05:54 (外部編集)