這些天一直被SVN的分支間的合并(Merge)折磨的夠嗆,大家也都反映:在連個分支之間合并太麻煩了,有時候根本不知道上次合并了哪個版本。當時想了一些方法,爭取從流程上防止出現錯誤:
1. 每個人都只合并自己的修改
有時候一個fix會涉及多個人的修改。
2. 每一個fix就合并一次,以免修改太多,記不清
大部分時候一個fix都要反反覆複修改,並且修複的同時,可能還會新的需求過來。
3. 合并後提交時,在注釋中寫明合并到了哪個版本。
雖然可以寫的清楚,但是在log中也不好尋找,而有時候合并是要跳過某些版本的。
大家都在“抱怨”這個合并過程,並且前幾天還出現過一次嚴重的問題。當時,由於著急發布,而合并時又出現了,開發人員就用主分支中的最新內容覆蓋了發布分支中的代碼,一些還沒有測試的代碼就被發布了。還好那天沒有出現大的問題,隨後就有穩定版本上線。一個很現實的問題擺在了眼前:如何才能很好地跟蹤合并曆史。。
有高手推薦了Git,我本人並不對反對使用Git,但是現在改用Git,必然會帶來更多的學習開銷。不過好像也沒有別的方法,就開始嘗試git。在Git的介紹中,提到了一個顯著的特性就是合并跟蹤,而最意外的收穫就是:SVN從1.5(2008年呀。再次鄙視一下自己的孤陋寡聞)開始就支援合并跟蹤了。那就繼續使用SVN了。
先交代一下項目中使用SVN的情境:CentOS,Apache2 + Subversion
到伺服器上看下當前SVN伺服器的版本(svn --version)是1.4,首先想到的就是升級:
# yum update subversion
還是真有福氣呀,現在Cent OS中的倉庫中已經有了1.6.11。
然後在本地工作目錄使用TortoiseSVN更新,得到錯誤資訊:could not open the requested svn filesystem。在伺服器上查看httpd的error.log,發現了:(20014)Internal error: Expected FS format '2'; found format '4'。
原來伺服器端程式升級完以後,倉庫也需要升級:
# svnadmin upgrade myrespository
倉庫升級完畢後,重新啟動httpd,再使用用TortoiseSVN更新時,又得到了另外的錯誤:Can't open file '/var/www/svn/myrepository/db/txn-current-lock': Permission denied。看起來是許可權有問題,不過myrepository的許可權都屬於apache.apache,好像是沒有問題。於是進入myrepository,查看個子目錄或者檔案的許可權,發現其中一個新檔案format屬於root.root。和其他目錄下的format進行對比,果真是這個檔案有問題,使用:
# chown apache.apache format
進行修改。然後再重啟httpd服務。
完成了以上步驟後,用戶端和伺服器端都可以正常使用了。
這時,當完成一次合并後,再合并時就會發現已合并的版本變成了灰色。