tech_memo / svn


tech_memo

vimdiff風にファイル差分を表示する

参考

手順

  1. 適当な場所にvimdiffを呼び出すシェルを作成する。
    • 例として、/usr/local/bin/svndiffwrap.sh とする
      #!/bin/sh
      
      /usr/bin/vimdiff ${6} ${7}
  2. 実行権限付与
    chmod +x /usr/local/bin/svndiffwrap.sh
  3. $HOME/.subversion/config のhelper項目に以下を追記する
    [helpers]
    diff-cmd = /usr/local/bin/svndiffwrap.sh
  4. これで設定は完了。普通にsvn diffを実行すると、vimdiffが呼び出される
  • ちなみに、一時的にsvn diffコマンドを変更したい場合は、diff-cmdオプション(と-x(--extentions))を指定する
    svn --diff-cmd "diff" --extensions "-y" diff -r10:head hoge.txt

リポジトリ移行

  • 参考
  • 移行元リポジトリをダンプ
    svnadmin dump <リポジトリパス> | svndumpfilter --drop-empty-revs --renumber-revs include Top/trunk/project1 Top/tags/project1 Top/branches/project1 > org_repo.dump
    オプション意味
    include1部のファイル・ディレクトリだけダンプする場合に指定。ただし、過去に指定外のパスからsvn mvやcopyなどしているとエラーになる。その場合は、そのパスもincludeの引数に指定する
    --drop-empty-revsincludeやexcludeを指定した場合に、関係ない過去コミットは「単に番号が飛ばないようにするための空のリビジョンです。」的なリビジョンでdumpされるため、それを抑止する
    --renumber-revs--drop-empty-revsを指定しただけだと、リビジョンが飛番になるので、それを抑止する
  • dumpファイルの編集
    • 出来たdumpファイルのままだと、元のリポジトリのパス構成のまま新しいリポジトリにコピーされてしまうので、「Node-path」および、「Node-copyfrom-pat:」 の部分を編集
      sed -i 's%Node-path: Top/%Node-path: %' org_repo.dump
      sed -i 's%Node-copyfrom-path: Top/%Node-copyfrom-path: %' org_repo.dump
  • 移行先にdumpファイル内の最下層より一つ上までのディレクトリを作成
    svn mkdir trunk branches tags
    svn commit -m "Create top directories."
  • リストア
    svnadmin load <移行先リポジトリパス> < org_repo.dump
    • リストアするディレクトリ配下を指定したい場合(svn mkdirしておく必要あり)
      svnadmin load --parent-dir New-Top <移行先リポジトリパス> < org_repo.dump

SVNリポジトリ作成 + apache公開

  1. リポジトリ作成
    svnadmin create <リポジトリパス>
  2. 権限変更
    chown -R apache:apache <リポジトリパス>
  3. webDav導入
    yum install mod_dav_svn
  4. subversion設定ファイルを作成
    # vim /etc/httpd/conf.d/subversion.conf (ファイル名は任意)
    • 誰でも参照・更新可能
      <Location /svn/repos>
        DAV svn
        SVNParentPath "<リポジトリパス>"
        SVNListParentPath on
      </Location>
    • Basic認証付
      <Location /svn/repos>
        DAV svn
        SVNParentPath "<リポジトリパス>"
        SVNListParentPath on
        AuthType Basic
        AuthName "Subversion repository"
        AuthzSVNAccessFile <任意のパス>/authzsvn.conf
        AuthUserFile <任意のパス>/.htpasswd
        Require valid-user
      </Location>
  5. apache設定ファイルリロード
    service httpd reload
  6. Basic認証ユーザ作成
    htpasswd <上記任意のパス>/.htpasswd <OSユーザー名>
  7. ユーザ権限設定(サンプル)
    # vim <上記任意のパス>/authzsvn.conf
    
    [groups]
    dev = hoge, huga
    admin = hoho
    
    [/]
    * = r
    dev = rw
    admin = rw
    me = rw

コマンド集

特定のディレクトリをワーキングディレクトリから除外

コメントの取得

  • svnlookを使う
    • リビジョン指定
      svnlook log -r <リビジョン> <SVNディレクトリパス> 
    • トランザクション番号指定 (hooksスクリプトなどで利用)
      svnlook log -t <トランザクションID> <SVNディレクトリパス> 
      • SVNディレクトリパスはリポジトリ本体のパス(URLではない)

subversionのバージョンアップ

  • RHEL5.5の環境だとsvnのバージョンが1.4.2で、RHEL6.5だと1.6.11だが、svn:externalsを使用するときに両者の引数の指定順が逆なので、リポジトリの共有がうまくできない(どちらかのsvnコマンドが失敗する)
    svn propset svn:externals <リンク元URL> <リンク名> # 左記は1.6.11(RHEL6.5)の場合。1.4.2(RHEL5.5)では引数順が逆になる
  • 以下にRHEL5.5上でのsvnの1.7へのバージョンアップ方法を記載する(1.6へのバージョンアップは見つからなかったが、1.7でも上記問題は解消される)
  1. Wandisco yumリポジトリを作成
    vim /etc/yum.repos.d/wandisco.repo
    
    [wandisco-svn]
    name=WANDisco Repository - snv-1.7 centos5
    baseurl=http://opensource.wandisco.com/centos/5/svn-1.7/RPMS/$basearch/
    enabled=0
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-WANdisco
  2. GPG keyのインポート
    [root@sv05 ~]# wget http://sv18/cobbler/localmirror/pkgs/RPM-GPG-KEY-WANdisco
    [root@sv05 ~]# rpm --import RPM-GPG-KEY-WANdisco
  3. 現在のsubversionをアンインストール
    [root@sv05 ~]# rpm -e subversion.x86_64 subversion.i386 # i386とx86_64のmultipleパッケージになっているので両方抜く
  4. subversionをインストール
    [root@sv05 ~]# yum install --enablerepo=wandisco-svn subversion 
    
    # 中略
    
    =============================================================================================================================
     Package                        Arch                  Version                              Repository                   Size
    =============================================================================================================================
    Installing:
     subversion                     i386                  1.4.2-4.el5_3.1                      core-2                      2.3 M
     subversion                     x86_64                1.7.22-1                             wandisco-svn                2.4 M
    Installing for dependencies:
     apr-util-ldap                  x86_64                1.5.3-2.WANdisco.8                   wandisco-svn                6.4 k
     apr-util-pgsql                 x86_64                1.5.3-2.WANdisco.8                   wandisco-svn                 11 k
     apr-util-sqlite                x86_64                1.5.3-2.WANdisco.8                   wandisco-svn                8.4 k
    Updating for dependencies:
     apr                            x86_64                1.5.0-1.WANdisco.2                   wandisco-svn                 98 k
     apr-util                       x86_64                1.5.3-2.WANdisco.8                   wandisco-svn                 81 k 
    
    Transaction Summary
    =============================================================================================================================
    Install       4 Package(s)
    Upgrade       2 Package(s)
    
    Total download size: 2.6 M
    Is this ok [y/N]:

    # 以上でインストールは完了。すでにチェックアウト済みのローカルリポジトリを操作するには、一度 svn upgrade コマンドを実行する必要がある

    [soapui@sv05 soapUI_scripts]$ svn update
    svn: E155036: Please see the 'svn upgrade' command
    svn: E155036: Working copy '/home/soapui/soapUI_scripts' is too old (format 8, created by Subversion 1.4)
    [soapui@sv05 soapUI_scripts]$ svn upgrade

削除されたディレクトリをsvn export

svn export <削除ディレクトリのURL>@<リビジョン>

リポジトリのIP変更

  • リポジトリのIPが変更になり、ローカルのworkingディレクトリと同期が取れなくなったときにも有効。以下のコマンドで変更可能。
    • svn switch --relocate <変更前URL> <変更後URL>
      m-nawata@02a% svn info
      Path: .
      URL: http://svnserver/svn/trunk/Tools/COMMON_TOOLS/soapui/project_files
      // 省略
      
      m-nawata@myserver% svn switch --relocate http://svnserver/svn/trunk/Tools/COMMON_TOOLS/soapui/project_files   http://svnserver/svn/trunk/Tools/COMMON_TOOLS/soapui/project_files
      m-nawata@myserver% svn info                                                                                 
      Path: .
      URL: http://svnserver/svn/trunk/Tools/COMMON_TOOLS/soapui/project_files
      // 省略

過去リビジョンで削除したファイルを復旧する。

  • mergeは使えない。コピーでリビジョン + URL指定でやる
    svn copy -r 999 <削除ファイルURL> .

マージ

コンフリクト発生時

  • 参考 : http://te2u.hatenablog.jp/entry/2012/10/30/011106
  • コンフリクトが発生すると、以下の3ファイルが生成される
    #ファイル名説明
    1foo.workingワーキングディレクトリにある元のファイル(マージ先)
    2foo.merge-left.r1マージ元の変更前のファイル(rXXXは、マージを指定した開始リビジョン以前の最新リビジョン)
    3foo.merge-right.r5マージ元の変更前のファイル(rXXXは、マージを指定した終了リビジョン)
  • vimdiffで3ファイルをオープンする
    vimdiff foo.working foo.merge-left.r1 foo.merge-right.r5
  • 目的は変更内容をマージすることなので、foo.workingに、foo.merge-left.r1とfoo.merge-right.r5の差分を適用する。以下の条件に従って、foo.workingを編集する。
    • merge-leftとmerge-rightに差分があるところは、workingにマージする
    • merge-leftとmerge-rightには差分がなく、workingとmerge-rightに差分があるところは、そのまま残す。
  • foo.workingを保存し、foo(オリジナルファイル)にコピーする。
  • diffが想定通りか確認
    svn diff foo
  • コンフリクト解消コマンド実施
    svn resolved foo
  • 上記で、working、left、rightの一時ファイルは削除される。

SVNのリビジョンを戻す

svn merge -r HEAD:999 [PATH | DIR] # r999に戻る

ユーザ名とパスワードを引数指定で実行

svn export <URL> --username <USER_NAME> --password <PASSWORD>

externalsプロパティ

複数ディレクトリのリンクを張る

  • <リンク元> <リンクディレクトリ>の順で、改行で区切る
    m-nawata@silver02% svn propset svn:externals "http://svnserver/svn/branches/AMPM-4.0.9/IT/testTool/soapUI/project/ AMPM409
    http://svnserver/svn/branches/AMPM-5.0.0/IT/testTool/soapUI/project/ AMPM500
    http://svnserver/svn/branches/AMPM-4.2.4/IT/testTool/soapUI/project/ AMPM424" .

GUIでの設定

  • 黒須さんのメールから抜粋
    Tortoise Repository Browserにて
    →Proerty→New→Externals
    を選択することでexternalsプロパティを作成し、リンクを作成できます。

ファイルを更新せずにコメントだけ変更する

  • 前提条件として、pre-revprop-changeフックスクリプトが有効になっている必要がある
    cd <SVNリポジトリ>/hooks
    cp -p pre-revprop-change.tmpl pre-revprop-change
    chmod +x pre-revprop-change
  • 以下のコマンドでコメント変更
    svn propset --revprop -r 1234 svn:log <変更後コメント> http://xxxxxxxx/xxx/xxx
  • Eclipseからもできるらしい

SVN command

最新の20件

2023-01-26 2022-11-11 2022-03-02 2022-02-03 2021-11-18 2021-11-11 2021-10-27 2021-10-04 2021-09-30 2021-08-24 2021-04-01 2021-02-25 2020-08-13 2020-05-22 2020-04-16 2020-04-15 2020-03-23 2020-03-12 2020-02-27

今日の2件

  • counter: 529
  • today: 1
  • yesterday: 0
  • online: 1