svn的外部定義svn:externals
**:解決你的外部依賴 -- svn:externals
在日常的專案版本管理中, 根據自己的需要, 我們很有可能需要把不同的repository放到不同的目錄中, 又或者把幾個repository放到一起. 多數時候, 這都是為了解決build中的依賴, 所以這種"個性化"的結構是應該共享, 成為版本的其中乙個部分. 否則專案成員就需要各自建立這樣的結構, 風格不一, 也有可能造成遺漏.
subversion 內嵌的property就支援這樣的一種屬性:svn:externals.
我們先來看乙個例子: 假如我們有個calc的工程. 它依賴於一些第三方的聲音檔案, 放在了red-bean.com中. 先來看看設定好的屬性:
$ svn propget svn:externals calc
third-party/sounds
這樣,當我們需要checkout這個calc專案的時候, 會出現這樣的效果:
$ svn checkout
a calc
a calc/makefile
a calc/integer.c
a calc/button.c
checked out revision 148.
fetching external item into calc/third-party/sounds
a calc/third-party/sounds/ding.ogg
a calc/third-party/sounds/dong.ogg
a calc/third-party/sounds/clang.ogg
…可以看到, 第三方的檔案也一同被checkout下來.
由於外部的檔案是不可控的,如果總是取用外部最新的修改, 有可能和我們現有版本不配套, 現有的build就有可能不成功. 所以subversion也提供了指定特定的revision的功能. 假設外部專案和我們配套的版本是revision 21, 我們可以這麼做, 如:
$ svn propget svn:externals calc
third-party/sounds
third-party/skins/toolkit -r21
這樣,當我們下次checkout的時候, 就只會取到revision 21的版本, 這樣就不會影響到我們現有的build.
上面提到的主要是獲取svn:externals的, 如果需要設定這個屬性, 我們主要用的是 svn propset 或者 svn propedit.
需要注意的有兩點,
由於svn:externals需要指定的外部項多數都是多行的, 所以推薦使用propedit進行編輯.
這個屬性只對目錄起作用, 不可以應用在獨立的檔案當中.外部定義不可以指向相對路徑如通過外部定義建立的工作拷貝與主工作拷貝沒有連線,
當完成了對svn:externals的修改以後, 每次當你使用update的時候, 相應的外部檔案也會被檢查並且更新(當然, checkout的時候也是如此).
由於屬性也被納入了subversion的版本管理中, 所以你對目錄的修改都是可以上傳到伺服器上, 和其他的專案成員共享, 並基線化.
這個功能看上去很美, 就像是link一樣, 但是也有它的一些先天的不足, 就是這個屬性是靜態的! 如果svn結構出現變化的時候, 屬性並不會根據你的修改而改變, 這些這裡引用svn book中的一例子.
而且,當使用了https作為commit的時候, 也有可能出問題. 這裡就留點小關子, 不再這篇文章中贅述, 有興趣的朋友請閱讀svn book的charter3, 一定讓你獲益不少.
參考:
Meego原始碼管理
工作需要,編譯meego的核心。可是 rpm i kernel src.rpm 後,卻找不到去 了 rpm qa 也看不到的,後來想起應該是在 裡,進去一看,果然有,在sources和specs裡,一大堆的patch,看的頭暈。rpm qf 也不說是哪個包裡的。看來src.rpm是不進rpm的資料庫...
scm 軟體配置管理
4 版本控制工具 1.更改原始檔,但不知道哪個是最新的 2.我不了解檔案的修改過程,尤其是最後修改了哪幾行以及為什麼修改 1.make時,經常用錯檔案的版本 多人修改乙個檔案,有些人的結果被沖掉了 程式誤刪了,只能重寫 花了一周時間,終於查出了乙個錯誤,但發現有個同事上週前已經修改了同樣的錯誤,但我...
原始碼包服務管理
一 原始碼包安裝服務的啟動 使用絕對路徑,呼叫啟動指令碼來啟動。不同原始碼包的啟動指令碼不同。可以檢視原始碼包的安裝說明,檢視啟動指令碼的方法。root localhost xinetd.d usr sbin apachectl stop root localhost xinetd.d usr sb...