svn的一些配置
/*-------------------------------------------------------------------------------*/
本文介紹了配置管理員和高級用戶可能用到的其他功能,分別為:
1,使用“鎖定-編輯-解鎖”模型
2,自動化屬性
3,忽略文件
4,關鍵字替換
5,外部定義
/*-------------------------------------------------------------------------------*/
1,使用“鎖定-編輯-解鎖”模型
Subversion使用與CVS相似的工作模型,也就是“拷貝-修改-合并”,但是有時候還是很有必要使用“鎖定-編輯-解鎖”模型,例如對于二進制文件,或者其他不太適合合并的文件。
屬性在《使用Subversion進行版本控制》這本書里也被稱為元數據,是附加到版本控制下的文件之上的屬性,就像最后的修改日期是一個文件的屬性一樣,你可以為Subversion控制之下的文件和目錄設置自定義的屬性。關于屬性的詳細信息可以看:http://www.subversion.org.cn/svnbook/1.2/svn.advanced.locking.html#svn.advanced.locking.lock-communication 。
在Subversion 里是通過內置的屬性“svn:needs-lock”實現“鎖定-編輯-解鎖”模型的,例如我們有一個word文件“介紹.doc”,大家很清楚Word 文件是二進制格式(據說以后都是XML的,但是可能也無法靈活的合并),不可能使用“拷貝-修改-合并”模型,所以我們要使用“鎖定-編輯-解鎖”模型。你可以將它設置屬性“svn:needs-lock”,然后提交,之后其他人在更新這個文件的時候,就會得到一個只讀的文件,他們想修改這個文件必須首先獲得鎖,獲得鎖的過程會將文件置為可寫,而其他人此時如果想得到鎖就會發現做不到,只有得到鎖的人放棄鎖定,別人才能得到鎖,繼續工作。下面分別講述了如何使用svn命令行和TortoiseSVN設置鎖和使用鎖。
1) 設定“svn:needs-lock”屬性
使用命令行鎖定“介紹.doc”:
svn propset svn:needs-lock 'x' 介紹.doc
運行這個命令后,“介紹.doc”就已經是設置了“svn:needs-lock ”,但為了使之生效還要運行“svn commit”,之后其他用戶update的時候就會發現這個文件已經是只讀的了。需要注意的是我們設置的屬性值是“x”,實際上任意值都可以, Subversion會忽略其內容。
使用TortoiseSVN設定屬性也很簡單:
“介紹.doc”右鍵選中- >屬性->Subversion選項夾->properties->add,然后在彈出的窗口中的property name選擇“svn:needs-lock”,值任意,然后選擇OK。之后再提交“介紹.doc”即可。
/*-------------------------------------------------------------------------------*/
2)獲取鎖
在設定了這個屬性之后,我們要想修改“介紹.doc”,就必須首先獲得鎖,使用命令行操作如下:
svn lock 介紹.doc
這樣“介紹.doc”就變成了可寫文件,你可以進行編輯修改了,這個時候如果有人和你一樣期望獲得這個文件的鎖就會得到錯誤的提示,表示文件已經被你鎖定了。
使用TortoiseSVN的操作依然簡單,“介紹.doc”右鍵選中-> TortoiseSVN -> Get Lock... ,然后輸入鎖定的注釋,選擇“OK”,既完成了鎖定。
3)釋放鎖
當你完成了修改,選擇提交后,默認就會釋放鎖,別人就可以重新獲得鎖。當然你也可以放棄修改,直接選擇釋放鎖,操作如下:
svn unlock 介紹.doc
這樣“介紹.doc”就重新變成只讀,別人就可以獲得鎖并進行修改了。
使用TortoiseSVN的操作為,“介紹.doc”右鍵選中-> TortoiseSVN -> Release Lock,然后選擇確認即可。
/*-------------------------------------------------------------------------------*/
2,自動化屬性
論壇里曾經有人問到如何實現前一個問題,然后又問到如果有很多文件需要做這樣的設置該如何處理。這時可能就需要自動化屬性功能,通過文件名匹配的方式將某類文件設置某種屬性。我們還是以Word文檔為例,設定將所有Word文檔設置為只讀。
這里我們用到了Subversion的運行配置區特性,Subversion的許多全局的配置參數都是放在運行配置區中,運行配置區實際上就是一個目錄,在我的XP操作系統這個目錄是“C:\Documents and Settings\rock\Application Data\Subversion”,其中rock是我的用戶名,在UNIX下這個目錄可能是“.subversion”。在這個目錄里config文件是客戶端操作的一些屬性,而servers則是服務器端的屬性,這一部分我們要使用config文件。
打開運行配置區的config文件,去掉“enable-auto-props = yes”前面的“#”和空格,然后找到“[auto-props]”小節,增加下面的屬性并保存即可實現Word文件的自動添加需要鎖定的屬性:
*.doc = svn:needs-lock=x
作了這個設置后,以后通過“svn add”和“svn import”添加的*.doc文件都會有“svn:needs-lock”屬性,當然你愿意,你也可以把上面的值修改為“* = svn:needs-lock=x”,這樣所有新加的文件都是進入了“鎖定-編輯-解鎖”模型。
需要注意的是這些設置是針對客戶端的,其他用戶還需要做同樣的設置。
/*-------------------------------------------------------------------------------*/
3,忽略文件
在執行svn status等操作時,我們不想看到某些文件,就要使用設置屬性進行忽略。在Subversion有兩種方式進行這個設置,一個是更改全局設置,也就是前面提到的config文件,另一個是使用svn的內置屬性“svn:ignore”。
1)使用config的global-ignores配置
假定我們的程序會編譯出很多exe文件,如果不使用忽略屬性,當我們執行“svn status”結果會是這個樣子:
? admin\test.exe
M admin\test.txt
為了不讓exe文件打擾我們,我們只需找到config文件的[miscellany]小節,修改global-ignores,增加對exe的忽略,我修改后的這一行變成:
global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store *.exe
然后再執行“svn status”,結果如下:
M admin\test.txt
2)使用svn的內置屬性“svn:ignore”
有時候匹配沒有這么普遍,例如Java的工程會在bin目錄生成的很多臨時Jar文件,我們只需要a.jar,而不希望temp.jar影響我們的視線,所以我們只需要設置bin的屬性“svn:ignore”為temp.jar即可,具體設置同上。
關于忽略的更多信息見:http://www.subversion.org.cn/svnbook/1.2/svn.advanced.props.html#svn.advanced.props.special.ignore
/*-------------------------------------------------------------------------------*/
4,關鍵字替換
在CVS里有一個很有用的功能,就是將源文件中的一些關鍵字替換,例如提交時間,作者等。Subversion默認不會對此類關鍵字進行處理,需要設置一些屬性,才能實現。
例如我們要在某個源文件的頭上自動添加最后一個修改人的名字和提交的時間,首先我們為這個文件設置屬性svn:keywords的值為“Date Author”,然后在這個文件需要添加作者和提交時間的地方增加下面這樣的字段:
$LastChangedDate$
$Author$
這樣這個文件提交后,對應的字符變成了下面的樣子:
$LastChangedDate: 2006-11-29 22:58:16 +0800 (星期三, 29 十一月 2006) $
$Author: root $
這里還存在一個問題,就是Subversion總是使用UTF-8替換文本,文件必須使用UTF-8編碼。如果我們的文件編碼是GBK,而日期顯示格式是上面的漢字形式,那得到的時間將是亂碼的。目前最實際的解決辦法是所有的文件使用UTF-8編碼;或者是盡量使出現的數據沒有漢字,例如對于路徑都是使用英文,對于時間使用英語的區域選項(我調整了中文的格式,但是無效)。
這部分的問題我想也可以通過屬性實現,但是需要修改源程序,可能還不能馬上實現。
更多可以使用關鍵字可以見:
http://www.subversion.org.cn/svnbook/1.2/svn.advanced.props.html#svn.advanced.props.special.keywords
/*-------------------------------------------------------------------------------*/
5,外部定義
這個功能也是論壇里經常被問到的一個問題,就是很多人希望有VSS的share功能,也就是一個文件在版本庫的多個位置有映像,一個地方修改,其它所有位置都能夠看到。
Subversion通過外部定義(svn:externals)屬性,能夠實現目錄的共享,但是對于文件,則只能支持類UNIX下的鏈接,這部分內容《使用Subversion進行版本控制》已經說得很清楚了,所以大家直接看書吧:
關于“共享(share)”功能,《軟件配置管理》一書有過評價,它認為這個功能不是很好的軟件配置管理習慣,如果一個文件可以被共享,也意味這個文件似乎可以成為獨立的模塊,需要重新規劃了。
posted on 2008-09-14 13:57
小咔咔 閱讀(2257)
評論(0) 編輯 收藏 所屬分類:
SCM