Subversionの属性

Suvbersionには属性というのが指定でき、これが結構興味深かったので。

属性とは

ディレクトリとファイルのバージョン管理に加えて、Subversionはバージョン化されたファイル、ディレクトリに付随したバージョン化されたメタデータの追加、修正、削除のためのインターフェースを用意しています。
このようなメタデータを属性と呼びます。

はい意味ワカラン。
  まあ言葉なんてものはどうでもよくて、使い方を理解していればいいわけです。

使い方

その1 svn:ignore

まず一つ目。
  Subversionのバージョン管理下に置くには、svn importコマンドを使いますが、その時に余計なファイルがimportされてしまうことがあります。
  そんなときは、

$ svn propset svn:ignore *.txt .
property 'svn:ignore' set on '.'

これはカレントディレクトリ(.)から拡張子がtxtのものをsvn import, svn add, svn statusの対象から除外するというものです。
  svn:ignoreというのが「属性」になります。

  ちなみに属性とは関係ないですが無視したいファイルであれば、.subversion/configファイルのglobal-ignoreで指定できます。
  デフォルトは*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Storeのようです。

$ vi .subversion/config
--------------------------------------------------------------------------
### Section for configuring miscelleneous Subversion options.   
[miscellany]
### Set global-ignores to a set of whitespace-delimited globs
### which Subversion will ignore in its 'status' output, and
### while importing or adding files and directories.
global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store *.txt
--------------------------------------------------------------------------

というようにすれば、拡張子が.txtのファイルが全てsvn import, svn add, svn statusから削除されます。
  こちらもちなみに、ですがsvn statusにてsvn:ignore属性のファイルを表示したい場合は

$ svn status --no-ignore
その2 svn:keywords

これは以下のように使います。

$ svn propset svn:keywords "Date Revision Auth Revision" hello.php
property 'svn:keywords' set on 'hello.php'

hello.phpの中身は

<?

//$date$
//$Revision$
//$Author$
//$HeadURL$

print("Hello World.");

?>

だったとします。
  すると、更新した瞬間に

<?

//$LastChangedDate: 2008-05-11 01:10:59 +0900 (Sun, 11 May 2008) $
//$Rev: 560 $
//$Author: orangehat $
//$HeadURL: file:///home/xxxx/svn/trunk/hello.php $

print("hello world.");

?>

というように更新した時間(Date)、更新者(Author)、リビジョン($Rev)、リポジトリ上のURL(HeadURL)が置換されて、勝手に更新される!?というものです。
  これって意外と便利なんじゃないかなあと思ったりする。
  ちなみにEclipseSubversionプラグインSubclipseでは、右クリック > チーム > プロパティの設定 で同じように設定できます。

その3 EOLの改行

よく知られているようにWindowsのEOLはCRLFUNIXLFがデフォルトになっています。
  そのため、Windowsで編集したファイルをコミットしてサーバ上のUNIXに更新をかけるとします。
  するとWindowsの改行であるCRLFUNIX上では^Mで表示されたりしてしいます。
  誰もが経験するイラっとなわけですが、これも属性で解決できます。

$ svn propset svn:eol-style LF hello.php

UNIX上のファイルにやってやると、たとえWindowsCRLFで編集したファイルをコミットしても、勝手にUNIX上のhello.phpの改行コードをLFに直してくれたりします。

  ちなみにこちらも、.subversion/configで設定できたりします。

$ vi .subversion/config
--------------------------------------------------------------------
### Section for configuring automatic properties.
[auto-props]
### The format of the entries is:
###   file-name-pattern = propname[=value][;propname[=value]...]
### The file-name-pattern can contain wildcards (such as '*' and
### '?').  All entries which match will be applied to the file.
### Note that auto-props functionality must be enabled, which
### is typically done by setting the 'enable-auto-props' option.
# *.c = svn:eol-style=native
# *.cpp = svn:eol-style=native
# *.h = svn:eol-style=native
# *.dsp = svn:eol-style=CRLF
# *.dsw = svn:eol-style=CRLF
# *.sh = svn:eol-style=native;svn:executable 
# *.txt = svn:eol-style=native
# *.png = svn:mime-type=image/png
# *.jpg = svn:mime-type=image/jpeg
# Makefile = svn:eol-style=native
*.php = svn:eol-style=LF
--------------------------------------------------------------------

これはスバラシイ!!

その他属性コマンド

  • 属性編集
$ svn propedit 属性名 ファイル(ディレクトリ)
  • 属性リスト表示
$ svn proplist ファイル(ディレクトリ)
  • 属性削除
$ svn propdel 属性名 ファイル(ディレクトリ)

それにしてもSubversionのドキュメントを読んでると知らんことばっかやなあ。
  まあ使うかどうかは別やけど。