什么是 svn property?
由于svn来说文件有很多属性,因为svn客户端是跨平台的,对于代码库的文件,需要根据这些属性以及客户端所在平台来处理工作空间文件的属性。例如我们 常见的Windows文件的回车换行和Unix文件的换行是不相同的。我们可以通过指定svn文件中的 svn:eol-style 属性来实现, 具体命令如下 svn propset svn:eol-style native。
如果你想指定一个shell脚本为可执行文件, 你可以通过命令使用 svn propset svn:executable 文件名来实现。
如何设置svn自动属性
前面提到的文件属性要设置起来通过命令行的方式很麻烦,我们可以通过修改 Subversion的配置文件让Subsersion自动实行上面的操作。 具体做法如下:
修改 home/Subversion/config 文件。
启用和设置自动属性,是在 config 配置文件中完成的。 config 配置文件的位置:
Unix 平台
全局的配置文件位置为:/etc/subversion/config;
每个用户主目录还有配置文件覆盖全局配置文件的设置:~/.subversion/config;
Windows 平台
全局配置文件:%ALLUSERSPROFILE%Application DataSubversionconfig,用户个人配置文件:%APPDATA%Subversionconfig
将 enable-auto-props = yes
然后添加如下的内容
Subverion 和 CVS 都有一模固定的參數可以加入, 然後只要加入後, 就會依照指定的值, 每次更新時自動修改此值.(在下面這種我統稱叫 SVN 變數 好了)
ex: 以 CVS 為例, 只要於檔案中加入 下述:
$Id$, CVS 在更新時就自動會將 $Id$ 換成 $Id: index.php,v 1.21 2007/12/11 10:12:37 tsung Exp $
$Source$: $Source: /CVSROOT/project/webroot/index.php,v $
$Author$: $Author: tsung $
但是在 SVN 需要多一個步驟, 假如要讓 SVN 自動產生版本編號, 在加入 $Rev$ 後, 需要再多執行下面這行指令:
svn propset svn:keywords "Revision" index.php
這樣子 $Rev$ 才會自動更新成此次 svn 的版本編號, 會變成 $Rev: 130 $
要自動多設 SVN變數 可以這樣子設定(自動將 Id, Date 轉換成 svn 的值):
svn propset svn:keywords "Id Date" index.php
Subversion 的這種參數有下述這些, 每次要用都要記得用 propset 設定一下此次要用的 keywords:(目前全部有下面這五個 SVN變數 可以用)
$LastChangedDate$ or $Date$: $LastChangedDate: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $. 最後更新日期.
$LastChangedRevision$ or $Rev$: $Revision: 144 $ 自動更新成此次 svn 的版本編號.
$LastChangedBy$ or $Author$: $Author: harry $ 最後修改的人.
$HeadURL$ or $URL$: $HeadURL: http://svn.hostname/repos/trunk/index.php $ 最新版的程式 URL 路徑於此.
$Id$: $Id: index.php 4308 2007-12-22 09:28:08Z tsung $ 最常用的就是這個了, 需要的資訊大概都包在裡面了.
如果不想要每次都手動 svn propset 設定值的話, 也可以編輯 ~/.subversion/config 下述部份取自: Symfony Repository Tips)
[miscellany]
# 自動執行 propset 動作
enable-auto-props = yes
[auto-props]
# Scriptish formats
*.bat = svn:eol-style=native; svn:keywords=Id; svn-mine-type=text/plain
*.bsh = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/x-beanshell
*.cgi = svn:eol-style=native; svn:keywords=Id; svn-mine-type=text/plain
*.cmd = svn:eol-style=native; svn:keywords=Id; svn-mine-type=text/plain
*.js = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/javascript
*.php = svn:eol-style=native; svn:keywords=Id Rev Date; svn:mime-type=text/x-php
*.pl = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/x-perl; svn:executable
*.pm = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/x-perl
*.py = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/x-python; svn:executable
*.sh = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/x-sh; svn:executable
# 最簡的寫法(eol/mime 這些可以不設, 設不設的差別可見最下面的 Subversion 系統那篇 PDF)
*.html = svn:keywords=Id URL
svn:ignore
另外, 上述用的是 propset 的參數來做設定, 如果在 project 中, 有些目錄或檔案是在測試時後產生, 但是並不需要 commit 進去, 不過每次 svn st 都會跑出來干擾你, 可以用 propedit svn:ignore 來解決此問題:
svn propedit svn:ignore img
會出現讓你編輯不想編入的檔案, 寫入
*.jpg
這樣子之後 img/*.jpg 的檔案, 在 svn st 時就都不會出現囉~