!!クライアント
!RapidSVN
http://rapidsvn.tigris.org/
設定は不要。
Tortoise を使いたくない場合は、これがいいと思う。
http://amaxi.sitemix.jp/blog/archives/1493
このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。
アプリケーションを再度インストールすることにより問題が解決する場合があります。
っと表示されたら、
[Microsoft Visual C++ 2005 Service Pack 1 再頒布可能パッケージ ATL のセキュリティ更新プログラム |http://www.microsoft.com/downloads/ja-jp/details.aspx?familyid=766a6af7-ec73-40ff-b072-9112bab119c2&displaylang=ja]
をインストールする。
{{ref vcredist_x86.exe}}
!esvn
http://terai.xrea.jp/Subversion/eSvn.html
svnのコマンドが使える環境が必要。
http://subversion.tigris.org/
からダウンロードしてパスを通す。
・環境変数APR_ICONV_PATHをsubversionをインストールしたディレクトリの下のiconvに設定しないと文字化けする可能性あり。
!svn + ssh
ssh に使うコマンドは SVN_SSH 環境変数で指定する
例1:set SVN_SSH=D:/Program Files/putty/plinkw.exe -l testuser -i g:/temp/hoge.key
例2:export SVN_SSH="ssh -i /home/user/.ssh/XXXXXX.ppk"
!samba
svn checkout file://ホスト/svnRepos
svn checkout file:///\ホスト/svnRepos
svn checkout file:////ホスト/svnRepos
svn checkout file:\\\\ホスト/svnRepos
などでアクセス可能・・・かも?
!proxy
serversファイルのglobalセクションを編集
http-proxy-host = server_name
http-proxy-port = port
!!サーバー
!とりあえず使う
リポジトリを初期化します
svnadmin create C:\home\repos
または
svnadmin create /home/svn/test --pre-1.5-compatible
などでバージョンを指定しても良い。
インポートしたいディレクトリ以下で
svn import file:///リポジトリ -m "Initial import."
!Subversion & ssh で外部からアクセス可能。
SSHサーバーを立てて、リポジトリを初期化しておくだけ。
クライアントからは
svn ls svn+ssh://[ユーザー名@]localhost/home/hoge/repo
!Subversion & Webdavで外部からアクセス可能。
# svnadmin create --fs-type=fsfs /home/svnroot
# htpasswd -cm /home/svnroot/.htpasswd test
# chown -R apache:apache /home/svnroot
# chcon -R system_u:object_r:httpd_sys_content_t /home/svnroot
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
DAV svn
SVNPath /home/svnroot
# Limit write permission to list of valid users.
# Require SSL connection for password protection.
# SSLRequireSSL
AuthType Basic
AuthName "Authorization Realm"
AuthUserFile /home/svnroot/.htpasswd
Require valid-user
ユーザーファイルの作成は
htpasswd -c /home/svnroot/.htpasswd user1
ユーザの追加は
htpasswd /home/svnroot/.htpasswd user2
は、読込み以外は制限する意味。(読込みは認証を求めない)
!svnserve を使う
http://d.hatena.ne.jp/kanonji/20090915/1253019999
基本的に Linux の場合は、svn+ssh で良い。
Linuxでsvnserveを使ってldap認証を行うには[[svnserveでSASL認証]]を参照
以下は、Windows を前提とする。
*設定ファイルの編集
C:\svnrepos\conf\svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd
C:\svnrepos\conf\passwd
foo = passwordAsPlainText
*サービスの登録
sc.exe create svnserve binpath= "C:\Program Files\Subversion\bin\svnserve.exe --service --root C:\svnrepos" displayname= "Subversion" depend= tcpip start= auto
!!コマンド 使い方
!チェックアウト
svn co リポジトリ チェックアウト先
svn co file:///svn/repo .
!アップデート
他の作業者がコミットした変更点を自分の作業コピーにマージする。
svn update
update 時に表示される記号の意味は以下の通り。
,記号 ,意味
,A ,作業コピーに新しいファイルが追加された
,D ,作業コピーからファイルが削除された
,U ,作業コピーには何も手を加えていない状態でリポジトリから変更が行われた
,G ,作業コピーで変更を加えているファイルに対して、リポジトリから衝突が発生せずに変更が行われた
,C ,作業コピーで変更を加えているファイルに対して、リポジトリから変更が行われた際に衝突が発生した
!状態確認
作業コピーの状態を表示する
svn status
!作業内容を戻す
svn revert
作業コピーの内容を全て戻す場合は
svn revert -R .
!コミット
自分が変更した内容をリポジトリに登録する。
svn commit -m 'コミットメッセージ'
!ファイルやディレクトリを新規に追加する場合
普通に作業ディレクトリにファイルを追加する。その後
$ svn add hoge.txt
とする。ただしこの状態はあくまで予告なので本当に追加されるのは commitした時点である。
!ファイルやディレクトリを削除する場合
$ svn remove(rm / remove) hoge.txt
これも予告なので、commit時に削除される。
!ファイルやディレクトリの名前を変更する場合
$ svn move hoge.txt hoge2.txt
即座に名前が変更されます。
!履歴表示
コミットの履歴を表示する。
svn log
全て表示せずに、表示する数を指定する場合
svn log -l 10
svn copy した時点のリビジョンまで表示する場合
svn log --stop-on-copy
!ブランチの作成
svn copy コピー元 コピー先
!マージ
例えばブランチの変更点を全て作業コピーにマージする場合
svn merge -r10:20 file://svn/repo/branch .
!マージの適用状況を確認
svn mergeinfo source target
例えば、ブランチの変更点が全てtrunkにマージされているか確認
svn mergeinfo file://svn/repo/branch file://svn/repo/trunk
svn mergeinfo --show-revs merged file://svn/repo/branch file://svn/repo/trunk
逆にマージされていないリビジョンを表示する場合は
svn mergeinfo --show-revs eligible file://svn/repo/branch file://svn/repo/trunk
!ロック
svn lock test.txt
!ロックの強制
svn propset svn:needs-lock ON test.txt
svn propset -R svn:needs-lock ON *
!ロックの強制の解除
svn propdel svn:needs-lock test.txt
!アンロック
svn unlock test.txt
!ロックされているファイルの一覧
svnadmin lslocks ローカルリポジトリ
!!典型的なサイクル
!パターン1
開発が終了して保守期間での管理。
+修正毎にブランチを作成
+変更はブランチに対して行う
+テスト前に、トランクの修正内容をブランチにマージ
+テスト中の修正もブランチに行う
+リリース時にブランチに内容をトランクにマージ
++ブランチにマージした時点のトランクとブランチの差をトランクへマージ
+トランクのタグを作成
!以前のリビジョンに戻す
svn merge コマンドを使うと、反対向きの差分を指定して作業コピーの変更を「取り消す」ことができる。 以下はリビジョン 303 を破棄して 302 に戻す例である。
$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
!接続時のエラーについて
http://www.nabble.com/svn:-Expected-FS-format-%272%27--found-format-%273%27-td18827391.html
http://plaza.rakuten.co.jp/locomassy/diary/?ctgy=2
svn: Expected FS format '2'; found format '3'
のようなエラーの場合、リポジトリを作成したSVNとクライアントのバージョンが合っていない可能性あり。
format 2: Subverion 1.4 以降でアクセス可能
format 3: Subverion 1.5 以降でアクセス可能
svnadmin create /home/svn/test --pre-1.5-compatible
でリポジトリ作成時のバージョンを指定する良い。
!!その他
!―stop-on-copy オプション
ブランチが作成されたリビジョン(ブランチのベースリビジョンという)を探すには svn log コマンドで ―stop-on-copy オプションを利用する
!あるリビジョン以降で変更されたファイルの一覧
svn diff -r 100:head --summarize
このリストのファイルを他のディレクトリにコピーしたい場合は
{{ref copySVN.exe}} を使う。
svn diff -r 100:head --summarize > list.txt
copySVN list.txt todir
!特定のディレクトリ以下の更新を無視する
$ svn update --set-depth exclude path
戻すには
$ svn update --set-depth infinity
もしくはパスが正確にわかっているなら
$ svn update path
exclude 以外に以下の depth オプションがある。
,,
,exclude,対象ディレクトリを更新しない
,empty,対象ディレクトリの中身を更新しない
,files,対象ディレクトリの中にあるディレクトリを更新しない(ファイルのみ更新する)
,immediates,対象ディレクトリ内のファイルとディレクトリは更新するが、対象ディレクトリ内のディレクトリの中身は更新しない
,infinity,再帰的に全て更新する
!ローカルにファイルを残したまま、管理から外す
svn delete build --keep-local
!SVNでログメッセージを変更する
$ svn propset --revprop -r リビジョン svn:log "ログメッセージ"
ログの内容をファイルで指定する場合は
$ svn propset --revprop -r リビジョン svn:log -F log.txt
出来ない場合は、設定が必要。
[[SVNでログメッセージを変更する]]
!patch を作成、 patch を当てる
svn diff -rxxx:yyyy > patch
patch -p0 -l < patch
!merge 属性を消す
svn propdel -R svn:mergeinfo .
!svn status や svn merge --dry-run 実行時に表示される記号の意味
http://code1.jldg.org/trac/bridge/wiki/svn_trouble
,記号,内容
,U,ファイルがリポジトリの最新版に更新された
,A,ファイルが新規追加された
,D,ファイルが削除された
,R,ファイルが置き換えられた(同じ名前だが履歴上は別物)
,G,ローカルの修正とリポジトリの更新がマージされた
,C,ローカルの修正とリポジトリの更新が競合している
!mergeの後のcommitで、tree-conflictがでてcommitできない
tree conflictは、ファイルの存在に関する衝突です。 ローカルで消したファイルに変更点がある時などに発生します。
tree conflictが発生したファイルには、自動で差分を当ててくれないので、変更を自分で当ててください。 最後に、ファイルの変更点などを確認して、問題がなければ
$ svn resolve --accept working filename
でconflictの解消宣言をすれば、commitできるようになります。
!svn diff に -x のオプションを複数つける
svn diff -x "-b --ignore-eol-style" Hello.cpp
!svn diff で全てのスペースを無視する
svn diff -x "-w --ignore-eol-style" Hello.cpp
!svn diff で改行コードを無視する
diff --strip-trailing-cr file1 file2
!ブランチの派生元を調べる
svn log -v
でログの詳細が見れる。これで、ブランチの派生元も分かる。
svn log -v --stop-on-copy
!ファイル単位でマージする
ファイルを指定すればファイル単位でマージできる
svn merge -r20:25 test.txt
もし、ブランチで追加されたファイルをファイル単位でマージする場合は、svn cp でブランチのファイルをコピーする
svn cp svn://hoge/added.txt ./added.txt
!svnで他のパスにリンクを貼る
svn propset svn:externals 'hoge file://hogehoge/foo/bar'
{{category2 OS,Linux}}