Memo/Subversion

https://dexlab.net:443/pukiwiki/index.php?Memo/Subversion
 

Subversion(バージョン管理システム)メモ


リポジトリサイズ縮小

  • 古いsvnからdump -> 新しいsvnへrestoreでも多少サイズが減る。リポジトリのdump/create/load後のサイズ
    • svn 1.7 => 1.8
      svn versionrepo MB
      1.71216
      1.81206
    • svn 1.8 => 1.9
      svn versionrepo MB
      1.81347
      1.91199
  • サイズの大きいリビジョンを探す。単位MB
    du -m /var/www/svn/dev/db/revs/*/*  | sort -nr | head -n 10
  • リビジョンで変更されたファイル一覧
    svn log file:///var/www/svn/dev/ -v -q -r 242
  • svndumpfilterで特定のパスを捨てる
    svndumpfilter exclude /rpm/RPMS  < old.dump  > new.dump

svnsync: リポジトリミラー(同期)

  • svnsync
    • svn1.4以上
    • リモートのsvnリポジトリとローカルのsvnリポジトリを同期する。
    • リモートリポジトリのread権限があれば良い
    • dump/loadより早い
svnadmin create /var/www/svn/repos
svnsync init file:///var/www/svn/example http://svn.example.com/repos
svnsync sync file:///var/www/svn/repos

Subversion 1.8/1.9のインストール

  • CentOS 6/7
    • 古いバージョンは削除
      sudo yum remove subversion
      sudo rm /etc/yum.repos.d/WANdisco-1.7.repo
    • インストール
      dist_ver=$(grep -o -P "\d" /etc/redhat-release | head -n 1)
      svn_ver=1.9
      ARCH=$(uname -i)
      
      sudo bash -c "cat > /etc/yum.repos.d/subversion.repo << 'EOS'
      [subversion]
      name=Wandisco SVN Repo
      enabled=1
      baseurl=http://opensource.wandisco.com/rhel/$dist_ver/svn-${svn_ver}/RPMS/$basearch/
      gpgcheck=1
      gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-WANdisco
      EOS"
      
      sudo rpm -import http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
      sudo yum install subversion-perl.$ARCH subversion.$ARCH subversion-devel.$ARCH mod_dav_svn.$ARCH subversion-python.$ARCH
      svn --version
      svn, version 1.9.5 (r1770682)
    • httpd再起動
      sudo cp /etc/httpd/conf.d/subversion.conf /etc/httpd/conf.d/subversion.conf.rpmnew
      sudo cp /etc/httpd/conf.d/subversion.conf.rpmsave /etc/httpd/conf.d/subversion.conf
      sudo /sbin/service httpd restart
  • Ubuntu 12.04 LTS
    sudo sh -c 'echo "# WANdisco Open Source Repo" >> /etc/apt/sources.list.d/WANdisco.list'
    sudo sh -c 'echo "deb http://opensource.wandisco.com/ubuntu precise svn19" >> /etc/apt/sources.list.d/WANdisco.list'
    wget -q http://opensource.wandisco.com/wandisco-debian.gpg -O- | sudo apt-key add -
    sudo aptitude update
    sudo aptitude install subversionsvn --version
    svn, version 1.9.7 (r1800392)
  • 既存の古い作業コピーは以下のエラーが出るので1度だけアップグレード
    svn st
    svn: E155036: Please see the 'svn upgrade' command
    
    svn upgrade
  • 既存リポジトリのアップグレード: CentOS:
    cd /var/www/svn/
    ls -1 ./ | xargs -i sudo -u apache svnadmin upgrade {}

色つきdiff

  • colordiff をインストール
    vi ~/.subversion/config
    ----
    diff-cmd = colordiff
    ----

brame:誰が行を変更したのかを探す

  • file.txtの各行を変更したログを見る
    svn blame file.txt
       178        username #contents
       178        username 
       178        username *Android [#d6b42d7f]
    ...

diff:差分

# 一つ前と最新を比較
svn diff -r PREV:HEAD sample.txt

# チェックアウトした時点と最新を比較
svn diff -r BASE:HEAD sample.txt

# 明示的にリビジョンを指定して比較
svn diff -r 100:110 sample.txt

# 日付の範囲を指定して比較
svn diff -r {2012-9-1}:{2012-9-2} sample.txt

チェックアウトしたリビジョン番号の取得

  • リビジョン番号だけ欲しい場合
    LANG=C svn info | grep Revision | awk '{ print $NF }'
    // 300

初回チェックアウト時の認証の自動化

svn checkout --username user --password pass https://svn.example.com/svn/trunk/yourproject >logfile 2>&1 <<EOS
p
yes
yes
EOS

CentOS5.x/6.xにSubversion1.7をインストール

  • Subversion 1.7の良くなった所
    • 作業ディレクトリのトップだけに.svnが作られるようになった
    • HTTPv2対応
    • パフォーマンス改善
    • svn log --diff
    • svn diff --git
    • svn patch
    • svn relocate
  • CentOS5.8 x86_64へインストール
  1. 自動で行う場合
    • http://www.wandisco.com/subversion/download#centos からsvninstall_centos5_wandisco.sh をダウンロード。自動でやる場合は以下スクリプトを実行するだけ
      sudo su -
      chmod +x svninstall_centos5_wandisco.sh
      ./svninstall_centos5_wandisco.sh
  1. 手動で行う場合
  2. 既存環境をダンプ
    svnadmin dump /path/to/svn_repos > svn_repos_backup_file
  3. 既存環境を確認
    rpm -qa | grep subversion
    subversion-1.6.11-7.el5_6.4
    subversion-1.6.11-7.el5_6.4
    
    rpm -qa | grep svn
    mod_dav_svn-1.6.11-7.el5_6.4
  4. アンインストール
    yum remove subversion mod_dav_svn
  5. リポジトリ追加
    cat > /etc/yum.repos.d/WANdisco-1.7.repo << 'EOS'
    [WANdisco-dev]
    name=WANdisco SVN Repo 1.7
    enabled=0
    baseurl=http://opensource.wandisco.com/centos/5/devel/RPMS/$basearch/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-WANdisco
    EOS
    
    rpm -import http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
  6. インストール
    ARCH=`uname -i`;yum install --enablerepo=WANdisco-dev subversion-perl.$ARCH subversion.$ARCH subversion-devel.$ARCH mod_dav_svn.$ARCH subversion-python.$ARCH
  7. httpdの再起動
    cp /etc/httpd/conf.d/subversion.conf /etc/httpd/conf.d/subversion.conf.rpmnew
    cp /etc/httpd/conf.d/subversion.conf.rpmsave /etc/httpd/conf.d/subversion.conf
    service httpd restart
  • 既存の古い作業コピーは以下のエラーが出るので1度だけアップグレード
    svn st
    
    svn: E155036: Please see the 'svn upgrade' command
    svn: E155036: Working copy '/path/to' is too old (format 10, created by Subversion 1.6)
    
    svn upgrade

Androidの無視設定

  • 以下をプロジェクトルートディレクトリのsvn:ignoreに設定する
    *.apk
    *.ap_
    *.dex
    *.class
    bin
    gen
    local.properties
    .classpath
    .project
    .settings

ファイル名変更で502 bad gateway

  • SSLを使用している場合、NameVirtualHost?を使わないように変更すると収まったが、ディレクトリ一覧が見れなくなったり問題あり
    vi /etc/httpd/conf.d/vhost.conf
    ----
    #NameVirtualHost *:443
    ----
    service httpdf graceful
  • 記事
    • 2007-07-29 - cactusman日誌 ReverseProxy?を使っている場合。apache 2.2.4のソースからmod_headers.soだけをコンパイルして使用する方法

バグ予測

ドットファイルがコミットできない場合

  • subversionサーバのApache設定ファイル /etc/httpd/conf/httpd.conf や /etc/httpd/conf.d/ に以下ような記述が無いか探す。ある場合はコメントにして、apache再起動
    # dot file 403 Forbidden
    RedirectMatch 403 /\.

一括してファイルの追加、削除を行う

cat >> ~/.bash_profile << 'EOS'
alias svndel="svn st | grep '^!' | sed -e 's/\![ ]*/svn del /g' | sh"
alias svnadd="svn st | grep '^?' | sed -e 's/\?[ ]*/svn add /g' | sh"
EOS
. ~/.bash_profile

svnadd
svndel

Unsupported working copy format

  • エラー内容
    • Unsupported working copy format
    • svn: クライアントが古すぎて、作業コピー '.' を扱うことができません。もっと新しい Subversion クライアントをインストールするか、作業コピーをダウングレードする必要があります。詳しくは http://subversion.tigris.org/faq.html#working-copy-format-change を参照してください。
  • 対象ディレクトリと、バージョンを指定し、変更する
    /usr/local/bin/change-svn-wc-format.py . 1.5

gitと併用する

複数の属性を付ける

  • keyword 「"」で囲む必要がある
    svn propset svn:keywords "Date Author Id Revision HeadURL" filename
  • eol-style
    svn propset svn:eol-style "native" filename

.svnディレクトリ以外を列挙

  • tmp以下にある.svnディレクトリ以外を列挙
    find tmp -name ".svn" -prune -o -type d -print
  • tmp以下のディレクトリに一括無視設定
    find tmp -name ".svn" -prune -o -type d -print | xargs svn propset 'svn:ignore' '*'

sshポートフォワーディングを利用する

  • Poderosa等で1窓開く
    ssh -l ログイン先ユーザ名 -g -L 20443:127.0.0.1:443 ログイン先
  • Poderosa等でもう一窓開く
    $ svn co https://127.0.0.1:20443/svn/リポジトリ

実行属性を付ける

svn:executableを付ければ、環境に応じて実行属性を付けてくれる。
Windows上でチェックアウトした場合は無視される。
ファイルのみ有効。ディレクトリに設定しても効果は無い。

  • phpファイル全部に対して
    svn propset svn:executable on *.php

ファイル名の文字コード

もし、他のLinuxサーバにチェックアウトしたファイルを置く場合は、ファイル名はutf8が良さそうです。

Windowsの場合はSJIS, Linuxの場合は環境変数のLANGにより自動的に変換されます。

$ locale -a | grep ja
ja_JP.eucjp
ja_JP.sjis
ja_JP.utf8

各ブラウザでの対応状況が違うようで、文字コードによってダウンロードされるファイル名が%??になったります。

sjiseucjputf8
IE6NGNGブラウザNG。ダウンロードOK
Firefox2OKOKOK
Opera9ブラウザOK。ダウンロードNGブラウザNG。ダウンロードOKブラウザNG。ダウンロードはOK

ftpで.svnディレクトリを除外して同期したい時

  • lftp のmirrorコマンドで、-x オプションを指定する
    $ cd /path/to/www/
    $ lftp -u foo mywebsite.jp 
    > cd /path/to/www
    > mirror -Rev -x "\\.svn" .

".svn"を除外したファイル一覧

  • `-prune`オプションで、指定したファイル/ディレクトリ以下降りない
    find . -type d -name ".svn" -prune -or -print

svnファイルのパーミッション変更

svn ls -R | grep /$ | xargs chmod 705

svn作業ディレクトリのパーミッションを変更する

うっかりrootで作業すると、.svnディレクトリのパーミッションもrootになり、 他のユーザでコミット時に Permission denied になります。
その変更を元に戻します。

find . -name ".svn" | xargs chown -R 一般ユーザ:グループ

コミットログ変更時にメールを飛ばす

$ cd ${REPOS}/hooks/
$ chmod 755 post-revprop-change revprop-change-email.rb

コミットログの変更

  • デフォルト設定では、コミットログメッセージを変更できない。
    ログは属性で管理されており、属性はバージョン管理されていないため。
    http://subversion.bluegate.org/doc/ch05s02.html
  • それでも変更したい場合
    $ cd ${REPOS}/hooks/
    $ cp pre-revprop-change.tmpl pre-revprop-change
    $ chmod 755 pre-revprop-change

cvsリポジトリの変換

もし、変換中にRCSファイルでエラーが出て停止する場合は、RCSファイルを消せば良い。

cvs2svn --encoding=EUC-JP

コミット前のソースをexport

TortoiseSVNならば、チェックアウト状態のディレクトリからexport可能。
.svnディレクトリを除いたファイル・ディレクトリが出力される。

  • チェックアウトしたディレクトリ上で、右クリックしTortoiseSVN
  • 「エクスポート」で出力先を指定

tagの作成

リリースしたものをtagsに入れる。
「rel-日付」や「rel-バージョン」とするのがわかりやすいかも。

  • TortoiseSVNの場合
    1. ログを表示
    2. リビジョンからタグを生成
    3. コピー先にtags以下を指定
      https://.../svn/SandBox/tags/rel-20070213

svn:ignoreとワイルドカード

svn:ignoreで**.*の挙動。

  • *.txtと*.TXTを無視したい場合
    *.[tT][xX][tT]
  • .fooとfooファイルを作成
    $ touch .foo
    $ touch foo
    $ touch foo.dat
  • *
    $ svn propedit svn:ignore .
    ----
    *
    ----
    $ svn status
     M     .
  • *.*
    $ svn propedit svn:ignore .
    ----
    *.*
    ----
    $ svn status
    ?      foo
     M     .
    

ソースからインストールしたsubversionをアンインストールする

Makefileにはuninstallが定義されていないので手動で削除する。

# rm -Rf /usr/local/man/man1/svn*
# rm -Rf /usr/local/man/man1/neon-config*
# rm -Rf /usr/local/info/svn*
# rm -Rf /usr/local/bin/neon-config
# rm -Rf /usr/local/bin/svn*
# rm -Rf /usr/local/lib/libsvn_*

外部ライブラリの取り込み

  • libs 以下に外部ライブラリを配置したい時。
    $ svn co https://svn.example.com/svn/SandBox/branches/
    $ cd branches
    $ mkdir libs
    $ svn add libs
    
    $ vi extern.txt
    ----------------------------------
    log4php -r11 https://svn.example.com/svn/labs/PhpLib/log4php/src/log4php/
    ...
    ----------------------------------
    
    $ svn propset svn:externals -F extern.txt libs
    $ svn commit -m "externals log4php"
    $ svn update
    $ rm extern.txt
  • 1つだけならば以下でも良い
    $ svn propset svn:externals 'log4php -r11 https://svn.example.com/svn/labs/PhpLib/log4php/src/log4php/' libs
    

バックアップ/リストア

  • dumpする場合
    • バックアップ
      svnadmin dump [repos_path] > [backup_file]
    • リストア
      svnadmin create --fs-type=fsfs [repos_path]
      svnadmin load [repos_path] < [backup_file]
  • 複数リポジトリのダンプ&インポート
  1. 「/var/www/svn/」にある複数リポジトリを「./svn_dump/」にダンプ
  2. 「./svn/」に新しいリポジトリを作成
  3. 「./svn/」にダンプしたデータをインポート
    svn_src=/var/www/svn
    svn_dump=./svn_dump
    svn_dest=./svn
    
    # dump
    for p in $(find $svn_src -maxdepth 1 -mindepth 1 -type d); do \
      echo "-- $p"; \
      [[ ! -f "$svn_dest/$(basename $p).$(date +%Y%m%d).gz" ]] && svnadmin dump $p | gzip > $svn_dump/$(basename $p).$(date +%Y%m%d).gz; \
    done
    
    # create repo
    for p in $(find $svn_src -maxdepth 1 -mindepth 1 -type d); do \
      echo "-- $p"; \
      [[ ! -d "$svn_dest/$(basename $p)" ]] && svnadmin create --fs-type=fsfs $svn_dest/$(basename $p); \
    done
    
    # load
    for p in $(find $svn_src -maxdepth 1 -mindepth 1 -type d); do \
      echo "-- $p"; \
      [[ -d "$svn_dest/$(basename $p)" ]] && zcat $svn_dump/$(basename $p).$(date +%Y%m%d).gz | svnadmin load $svn_dest/$(basename $p); \
    done
  • ディレクトリ構造のバックアップ
    svnadmin hotcopy [repos_path] [backup_path]
  • その他
    /usr/share/doc/subversion-1.2.1/tools/backup/hot-backup.py

Subversionリポジトリの統合

複数のリポジトリを1つに統合します。
ただし、tracのコンテンツの統合は難しそう。

  1. 統合するリポジトリのダンプファイルを作成する
    svnadmin dump /repository1-path | gzip > repo1.gz
    svnadmin dump /repository2-path | gzip > repo2.gz
  2. 統合先リポジトリを作成する
    svnadmin create --fs-type=fsfs /new-repository-path 
  3. 統合先リポジトリに統合されるリポジトリのファイルを格納するためのディレクトリを、各々一つずつ作成する
    svn co file:///new-repository-path
    svn mkdir path-to-dir1-for-repository1
    svn mkdir path-to-dir2-for-repository2
    svn commit -m "message"
  4. dumpした統合対象リポジトリを、各々のために用意したディレクトリにロードする(--parent-dir付き)
    zcat repo1.gz | svnadmin load /new-repository-path --parent-dir path-to-dir1-for-repository1
    zcat repo2.gz | svnadmin load /new-repository-path --parent-dir path-to-dir2-for-repository2
  5. リポジトリのリカバーを実行する
    svnadmin recover /new-repository-path
  6. tracも使用している場合は、同期を取る。
    trac-admin /trac-repository-path resync
    
    コミットログもちゃんと引き継がれます。

デフォルト構成リポジトリ作成スクリプト

  • スクリプト
    filesvn-scripts.zip
    ※編集し、各環境に合わせる事
  • デフォルト構成リポジトリ作成
    ./svn-create.sh プロジェクト名
  • ユーザ追加
    ./svn-adduser.sh ユーザ名

リビジョン間の差分をエクスポートする

  • TortoiseSVNの場合
  1. TortoiseSVNのメニューから「ログを表示」
  2. 2つのrevisionを選択する
  3. 右クリックして「リビジョンを比較」
  4. リストのすべてのファイルを選択する(CTRL+A)
  5. 「選択をエクスポート」で保存先フォルダを選択
    同様に「選択ファイルのリストを保存」だと、ファイル名一覧を保存できる(Unicode)
  • svn コマンドでリビジョン間差分ファイル名抽出(さらにgrepと組み合わせるとか)
    svn log -qv -rOLDリビジョン:NEWリビジョン リポジトリパス

svn copyとコミットログ

TortoiseSVNのデフォルトでは、svn copyや svn rename したファイルのログが表示されない。
ログ表示ウィンドウの「コピー/名前の変更」チェックを外すと表示されるようになる。

アクセス制御を行う

  • tagsディレクトリはコミット不可(commit-access-control.pl)
  • コミットログが空白の場合、コミットさせない(pre-commit)
  • etc
  1. デフォルトのpre-commit スクリプトをコピー
    cp ${REPOS}/hooks/pre-commit.tmpl ${REPOS}/hooks/pre-commit
  2. ソースからcommit-access-controlをコピー
    cp /usr/share/doc/subversion-1.2.1/tools/hook-scripts/commit-access-control.pl ${REPOS}/hooks/commit-access-control.pl
    cp /usr/share/doc/subversion-1.2.1/tools/hook-scripts/commit-access-control.cfg.example ${REPOS}/hooks/commit-access-control.cfg
  3. 実行権限を与える
    $ chmod +x pre-commit commit-access-control.pl
  4. commit-access-control.cfgを編集してアクセス制御を行う

コミット時にメールを飛ばす&該当チケットのクローズ

  • コミット時に指定したメールアドレスへコミット内容が送信されます
  • コミットログに以下のように書くと該当チケットが自動的にクローズされます
    fix #??
    fixed #??
    fixes #??,#??
  • 設定
    • リポジトリ毎にフックスクリプトを設定します。
    • ${REPOS} は該当リポジトリのパスに読み替えて下さい。
  1. デフォルトのpost-commit スクリプトをコピーして編集します。 filepost-commit
    cp ${REPOS}/hooks/post-commit.tmpl ${REPOS}/hooks/post-commit
  2. tracのスクリプトもコピーします。 filetrac-post-commit-hook
    cp src/trac-0.9.3-ja-1/contrib/* ${REPOS}/hooks/
  3. email送信スクリプトも同じディレクトリに配置し、内容を編集します。fileemail-send.rb
    ${REPOS}/hooks/email-send.rb
  4. スクリプトに実行権限を与えます
    $ chmod +x post-commit trac-post-commit-hook email-send.rb

copyやmoveでワイルドカードを使う

  • ruby
    拡張子がsqlのファイルを一つ上に移動する
    ruby -e "Dir.glob(ARGV[0]).each {|i| system(%| svn mv #{i} #{ARGV[1]} |) }" '*.sql' ..

エクスポート時に強制的に改行コードを指定する

  • ただし、ファイルに「svn:eol-style=native」属性が付いているもののみ有効
    svn export file://tmp/repos my-export --native-eol CRLF

Word,Excel,PowerPoint?,PDFの文書も比較する

  • xdocdiff
    TortoiseSVNでWord, Excel, PowerPoint?, pdfのdiffを見れるようにするツール。
    内蔵差分ビューアだと文字化けする(UTF-8しか対応してないため?)ので他の差分ツールを使うのがよさそう。
    • 文字化け
      xdocdiff_1.png
  • WinMerge
    • TortoiseSVNでの設定箇所
      tortoisesvn_diff.png
    • これで表示した場合
      winmerge.png

ブランチの作成

  • Subversionでは、リポジトリツリーの一部または全体をコピーすることができる。コピーしたリポジトリツリーをブランチとみなす。

タグの作成

  • Subversionでは、「タグをつける」という機能そのものはない。かわりにブランチをひとつ作成し、これに変更を加えないことで、タグとみなしている。

一般的なリポジトリレイアウト

  • Subversion:一般的なリポジトリレイアウト
    trunk/主系。
    プロジェクトの主な開発が行われるディレクトリ
    branches/変更を別の開発ラインに分離する。安定したら主系にマージする。
    一つの開発の流れが、もう一方と独立して存在しているが、 もし過去にさかのぼれば、同じ履歴を共有している
    tags/特定のリビジョン (たとえば、リリースリビジョン)に印をつける事。
    プロジェクトの「スナップショット」
    sandbox/お砂場。テスト用

一般的なプロジェクトディレクトリツリー

SAMPLE
└─trunk
    │  README       プロジェクトを説明する短い文章
    │  BUILDING     ビルド方法
    │  GLOSSARY     プロジェクト固有の専門用語
    │  
    ├─data         データファイル等
    ├─db           データベース関係
    ├─doc          ドキュメント類
    ├─src          プログラムソースコード
    ├─util         ユーティリティプログラム
    ├─vendor       サードパーティ製ライブラリやヘッダファイル
    └─vendorsrc    サードパーティ製ソースコード

特定ディレクトリ以下の複数の Subversion リポジトリを公開する場合

  • SVNParentPath? を使って、親ディレクトリを指定する
  • 以降、/svn/リポジトリ名 でアクセスできるようになる。
    # vi /etc/httpd/conf.d/subversion.conf
    ----------------------------------------------------
    <Location /svn>
       DAV svn
       SVNParentPath /home/svnroot
    
       # Limit write permission to list of valid users.
       <LimitExcept GET PROPFIND OPTIONS REPORT>
          # Require SSL connection for password protection.
          # SSLRequireSSL
    
          AuthType Basic
          AuthName "Authorization Realm"
          AuthUserFile /home/svnroot/.htpasswd
          Require valid-user
       </LimitExcept>
    </Location>
    ----------------------------------------------------
    # service httpd restart

現在の設定されている属性を表示する

svn -v proplist *.php

svnにパスワードを保存させない

共有アカウント等で最初の一人がコミットするとパスワードが保存されるため、他の人のコミットも最初の人の名前になって区別が付かなくなる。
毎回パスワードを入力させるように変更する。

# コメントアウトされている場合は外す
vi ~/.subversion/config
----
[auth]
...
store-passwords = no
store-auth-creds = no
----

# 認証済み情報削除
rm -f ~/.subversion/auth/svn.simple/*

エディタを指定する

$ vi ~/.subversion/config
------
[helpers]
...
editor-cmd= /usr/bin/vim

svn:mime-type自動属性設定

拡張子に応じて「svn:mime-type」を自動で設定できる。
ただし、クライアント毎に設定が必要

  • filesvn-config
  • Linux
    • /.subversion/config

  • Windows
    • TortoiseSVN -> 設定 -> 一般 -> 編集

添付ファイル: filesvn-config 411件 [詳細] filetrac-post-commit-hook 1316件 [詳細] filewinmerge.png 801件 [詳細] filexdocdiff_1.png 910件 [詳細] fileemail-send.rb 1241件 [詳細] filepost-commit 1368件 [詳細] filepost-revprop-change 1412件 [詳細] filerevprop-change-email.rb 1355件 [詳細] filesvn-scripts.zip 1806件 [詳細] filetortoisesvn_diff.png 822件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:38 (35d)