======Subversion======
Linuxがサーバ、macがクライアントとして使うという状況を想定しています。\\
vc-svn.plでvcが使いたいけど機能が足りないのでpsvn.plのほうで。というよりコマンドのほうが楽かも。 \\
psvn.plはCarbon Emacsだと始めから入ってます。\\
mac用GUI[[http://versionsapp.com/|versions]]
=====環境構築=====
{{tag>debian mac subversion}}
subversion環境を作るときのメモ
[[http://subversion.tigris.org/project_packages.html|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
#下の部分のコメントアウトをはずす
DAV svn
SVNParentPath /var/lib/svn
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
# 書き込みのみBasic認証を要求する場合
Require valid-user
レポジトリ。新しいレポ作るときは下二行を繰り返し。
$ 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つのファイルも削除されます。\\
これでコミットできるようになります。