目黒川の桜

目黒川の桜もだいたい散ってしまった。
毎年見に来る人が増えていたけれど、今年は特に多かった。
テレビの取材や芸能人がプライベートが来たりとか頻繁にあったらしい。
場所取りをした上で宴会を楽しむ上野公園の花見なんかと違って、目黒川は人が座れる場所はなく、川沿いを歩いて楽しむだけのはずだった。
しかし、今年は駐車場を転用して屋台ができたり、飲食する人が多かった。道にゴミが目立ち、鳩が集まってきたり、正直、目黒川の桜の雰囲気は悪くなったように思う。
目黒川沿いのお店で、そこのブログを昔から読んでるのだけれど、毎年この時期になると桜の状況を報告してくれていた。
あと2週間くらいで開花しそうですとか、今週末が満開で見ごろですとか、昨日の雨で散ってしまいましたとか。
ところが、今年はブログに一度も桜のことが紹介されなかった。
正直、そのお店の人もかなりウンザリしてるんではないのかなと、そう感じた。

技術情報 / Subversion / 間違ってコミットしたファイルを元に戻す

間違ってコミットしたファイルを元に戻す

0. diffでチェック

svn diff -r prev XXX.php

1.a. diffをとって、patchを当てる

svn diff -r prev XXX.php | patch -R

1.b.逆にマージする

svn merge -r head:prev XXX.php

1.c 古いファイルを取り直す

svn cat -r NN XXX.php > XXX.php

2. コミットする

svn commit XXX.php -m ''

技術情報 / Subversion / svnコマンド / svn propset / プロパティをサブディレクトリを含めて一括でセットする

プロパティをサブディレクトリを含めて一括でセットする

例えば画像ファイル(.jpg,.gif,.png)と圧縮ファイル(.zip,.exe,.lzh)を一括でsvn:ignoreをセットする場合、以下のよう。

すべての拡張子を抜き出す

for file in `find . -type f -exec basename {} \; `; do echo ${file##*.} ; done | sort | uniq > /tmp/file

拡張子を確認して過不足を調整する

vi /tmp/file

プロパティをセットする

svn ps -R -F /tmp/file svn:ignore .

確認する

svn pg svn:ignore

技術情報 / Subversion / ブランチを作る

ブランチを作る

リポジトリにトランクをコピーしてブランチを作る

svn copy file:///home/svn/foo/trunk file:///home/svn/foo/branches/1.0

新しい作業ディレクトリにブランチをチェックアウトする

svn co $HOME/work/new_foo

古い作業ディレクトリに未コミットのファイルがあれば、新しい作業ディレクトリにコピーする

rsync -avCc $HOME/work/foo $HOME/work/new_foo

技術情報 / Subversion / インストール・設定 / パスワードの保存

パスワードの保存

.subversion以下の設定ファイルに以下の設定を記述して、svn checkoutする。すると、パスワードが保存される。

$HOME/.subversion/servers:

[global]
store-passwords = yes
store-plaintext-passwords = yes

stackoverflow.com/questions/2599281/cant-make-svn-store-password-even-though-the-configuration-is-set-to-allow-it

技術情報 / Subversion / バイナリファイルの差分保存機能

バイナリファイルの差分保存機能

  • Subversionの利点である、バイナリファイルの差分保存について、少なくとも1GB以下のファイルなら上手く機能するという事らしい。
  • ファイルサイズが小さなバイナリファイルの場合はあまり圧縮出来ないようだが、数十MB程度の画像やOfficeファイルなら結構機能するらしい。
  • 但し、Subversionのバイナリ差分エンジンであるxdeltaを、Subversionからでなく、xdelta単体で使う方が圧縮効率は良いらしい。

参考

技術情報 / Subversion / svnコマンド / svn propset / キーワード置換

キーワード置換

手順

  1. バージョン管理されてるファイルにキーワードを$Date$のような形式で埋め込む。
$ cat foo.txt

#!/bin/sh
# ------------------------------------------------------------------------------
# $Date$
# $Author$
# $HeadURL$
# ------------------------------------------------------------------------------

echo "hello, world"
  1. svn:keywordsをpropsetする。
$ svn propset svn:keywords "Date Author HeadURL" foo.txt
属性 'svn:keywords' を 'foo.txt' に設定しました
  1. コミットする。
$ svn commit -m 'set keywords' foo.txt
追加しています              foo.txt
  1. キーワードが置換されている。
$ cat foo.txt
#!/bin/sh
# ------------------------------------------------------------------------------
# $Date: 2012-03-30 12:23:33 +0900 (金, 30  3月 2012) $
# $Author: taro $
# $HeadURL: file:///home/taro/svn_repos/svn/foo.txt $
# ------------------------------------------------------------------------------

echo "hello, world"

キーワード置換の幅を揃える

$ cat foo.txt
#!/bin/sh
# ------------------------------------------------------------------------------
# $Date$ # comment1
# $Author$ # comment2
# $HeadURL$ # comment3
# ------------------------------------------------------------------------------

echo "hello, world"

キーワード行にコメント(↑の例では「# comment1」等)を書く場合、↑のようにすると不揃いでかっこ悪い。なので、↓のように、

$ cat foo.txt
#!/bin/sh
# ------------------------------------------------------------------------------
# $Date::                                               $ # comment1
# $Author::                                             $ # comment2
# $HeadURL::                                            $ # comment3
# ------------------------------------------------------------------------------

echo "hello, world"

キーワードの次に「::」を書いてスペースを連続して「$」までの幅を揃える。これをコミットすると、↓のように置換される。

$ cat foo.txt
#!/bin/sh
# ------------------------------------------------------------------------------
# $Date:: 2012-03-30 12:42:37 +0900 (金, 30  3月 2012#$ # comment1
# $Author:: taro                                      $ # comment2
# $HeadURL:: file:///home/taro/svn_reps/foo.txt       $ # comment3
# ------------------------------------------------------------------------------

参考

svnbook.red-bean.com/en/1.6/svn.advanced.props.special.keywords.html

技術情報 / Subversion / 深度 / 特定のディレクトリをワーキングコピーから除外

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

命題

  • 以下のような構成のディレクトリ・ファイルがあり、全てのディレクトリ・ファイルはsubversionで管理されている。
  • 使用者はdocディレクトリ以下のファイルの編集に関与しない為、docディレクトリは除外して、ワーキングコピーを運用したい。

プロジェクトの構成

PROJECT_ROOT
|-- Makefile
|-- bin
|   `-- foo.exe
|-- doc
|   `-- README.txt
`-- lib
    `-- bar.dll

方法

  1. いったんルート直下のファイル・ディレクトリのみチェックアウトする。
$ svn co file:///$HOME/tmp/repos/ --depth immediates working-copy
A    working-copy/doc
A    working-copy/lib
A    working-copy/bin
A    working-copy/Makefile
リビジョン 6 をチェックアウトしました。
  1. docディレクトリを除外する。
$ svn up --set-depth exclude doc
D         doc
  1. docディレクトリはワーキングコピーから無くなった。
$ svn up
$ ls
Makefile  bin/  lib/
  1. リポジトリには存在する。
$ svn ls file:///$HOME/tmp/repos/
Makefile
bin/
doc/
lib/

参考

svnbook.red-bean.com/en/1.6/svn.advanced.sparsedirs.html

技術情報 / Subversion / 深度 / depthオプション

depthオプション

depthオプションとは

  • depthオプションで、svn checkout等のターゲットのディレクトリ下をどのように参照するか指定する。
  • set-depthオプションで、そのディレクトリのdepthのフラグを設定できる。
  • depthオプションの引数(フラグ)は以下。
    • files
    • empty
    • immediates
    • infinity

前提

PROJECT_ROOT
|-- Makefile
|-- bin
|   `-- foo.exe
|-- doc
|   `-- README.txt
`-- lib
    |-- bar.dll
    `-- baz
        `-- baz.dll

4 directories, 5 files

–depth empty ファイルもディレクトリも参照しない

$ svn co file:///$HOME/tmp/repos/ --depth empty working-copy
$ cd working-copy
$ ls
(何もない)
$ svn up
$ ls
(何もない)
$ svn up Makefile
$ ls
Makefile

–depth files ファイルだけ参照する

別のワーキングコピーでdoc/install/install.txtが追加され、doc/README.txtが更新され、コミットされた。

$ cd OHTER_WORKING_COPY/
$ svn commit -m 'update'
追加しています              doc/install
追加しています              doc/install/install.txt
送信しています              doc/README.txt

このワーキングコピーでdocディレクトリ以下のファイルだけ取り出すように–set-depth filesでフラグを付けて、svn updateする。

$ cd THIS_WORKING_COPY
$ svn up --set-depth files doc
U    doc/README.txt

README.txtファイルだけ更新された。以後、このワーキングコピーではdocディレクトリ以下はファイルだけしか参照しない。

$ svn up doc
$ ls doc/
README.txt

–depth immediates 直下のファイルとディレクトリだけ参照する

$ svn co file:///$HOME/tmp/repos/ --depth immediates somefiles
A    somefiles/doc
A    somefiles/lib
A    somefiles/bin
A    somefiles/Makefile

–depth infinity ファイルも更新も再帰的に参照する

$ svn co file:///$HOME/tmp/repos/ --depth infinity allfiles
A    allfiles/doc
A    allfiles/doc/install
A    allfiles/doc/install/install.txt
A    allfiles/doc/README.txt
A    allfiles/lib
A    allfiles/lib/bar.dll
A    allfiles/bin
A    allfiles/bin/foo.exe
A    allfiles/Makefile

参考

svnbook.red-bean.com/en/1.6/svn.advanced.sparsedirs.html

技術情報 / Subversion / ダンプ・リストア / 既存リポジトリのある階層以下を新規リポジトリに移す

既存リポジトリのある階層以下を新規リポジトリに移す

前提

既存のリポジトリパス
/home/svn/repos
移したいデータの階層パス(URL)
/foo/bar ()
新しいリポジトリパス
/home/svn/new_repos

既存のリポジトリからデータをダンプする

svnadmin dump /home/svn/repos | svndumpfilter include /foo > svn.data

新しいリポジトリを作る

svnadmin create /home/svn/new_repos

新しいリポジトリにデータをロード

する

svnadmin load /home/svn/new_repos < svn.data

技術情報 / Subversion / ダンプ・リストア / リポジトリのバックアップ

リポジトリのバックアップ

リポジトリのフォルダをそのままコピー

$ cp -a svn_repos svn_repos.backup.20160329
  • 簡単ですぐにバックアップ出来るが、OSやSubversionのバージョンの違いによって、バックアップを復元出来ない場合がある。

svnsync

  • RDBMSのレプリケーションのような使い方をする。
  • マスター?のレポジトリがあるとして、別のマシンにスレーブ?のレポジトリを作る。
  • スレーブマシン上でsvnsyncコマンドをCRONなどで定期的に実行する。

svnadmin dump

$ svnadmin dump /var/svn_repos > svn_repos.backup.20160329
$ svnadmin create /var/new_repos
$ svnadmin load /var/new_repos < svn_repos.backup.20160329

svnrdump

技術情報 / Subversion / ダンプ・リストア / あるリポジトリの配下に別のリポジトリを取り込む

あるリポジトリの配下に別のリポジトリを取り込む

前提

「work」と「doc」の2つのリポジトリがある。docをworkの直下に統合することにする。なお、リポジトリのファイルパスは、$HOME/svn以下とする。

方法

まずworkリポジトリ直下にdocディレクトリを作成する。次にdocリポジトリをダンプし、それをworkリポジトリにロードする。その際、–parent-dirオプションで最初に作ったdocディレクトリを指定する。実際には以下の通り。

svn mkdir file:///$HOME/svn/work/doc -m 'mkdir'
svnadmin dump $HOME/svn/doc > doc.dump
svnadmin load $HOME/svn/work --parent-dir doc < doc.dump