1. 程式人生 > >svn常見錯誤 解決辦法

svn常見錯誤 解決辦法

今天在提交專案檔案到本地SVN時提示錯誤如下:

過期:”global.php“在事務”21-1“,
You have to update your working copy first.

執行update更新後再次提交又出現如下錯誤:

svn: Commit failed (details follow):svn: Aborting commit: 'global.php' remains in conflict查了一下SVN的手冊才知道原來是多個版本之間遇到衝突。此時你需要解決衝突(合併別人的修改)。
--------------------------------------------------------------------------------

舉一個例子,Sally修改了sandwich.txt,Harry剛剛改變了他的本地拷貝中的這個檔案並且提交到伺服器,Sally在提交之前更新它的工作拷貝得到了衝突:

$ svn update C sandwich.txt Updated to revision 2. $ ls -1 sandwich.txt sandwich.txt.mine sandwich.txt.r1 sandwich.txt.r2

在這種情況下,Subversion不會允許你提交sandwich.txt,直到你的三個臨時檔案被刪掉。

$ svn commit --message "Add a few more things" svn: Commit failed (details follow): svn: Aborting commit: '/home/sally/svn-work/sandwich.txt' remains in conflict

如果你遇到衝突,三件事你可以選擇:

“手動”合併衝突文字(檢查和修改檔案中的衝突標誌)。

用某一個臨時檔案覆蓋你的工作檔案。

執行svn revert <filename>來放棄所有的修改。

一旦你解決了衝突,你需要通過命令svn resolved讓Subversion知道,這樣就會刪除三個臨時檔案,Subversion就不會認為這個檔案是在衝突狀態了。

$ svn resolved sandwich.txt Resolved conflicted state of 'sandwich.txt'

手工合併衝突
第一次嘗試解決衝突讓人感覺很害怕,但經過一點訓練,它簡單的像是騎著車子下坡。

這裡一個簡單的例子,由於不良的交流,你和同事Sally,同時編輯了sandwich.txt。Sally提交了修改,當你準備更新你的版本,衝突發生了,我們不得不去修改sandwich.txt來解決這個問題。首先,看一下這個檔案:

$ cat sandwich.txtTop piece of breadMayonnaiseLettuceTomatoProvolone<<<<<<< .mineSalamiMortadellaProsciutto=======SauerkrautGrilled Chicken>>>>>>> .r2Creole MustardBottom piece of bread小於號、等於號和大於號串是衝突標記,並不是衝突的資料,你一定要確定這些內容在下次提交之前得到刪除,前兩組標誌中間的內容是你在衝突區所做的修改:

<<<<<<< .mineSalamiMortadellaProsciutto=======後兩組之間的是Sally提交的修改衝突:

=======SauerkrautGrilled Chicken>>>>>>> .r2通常你並不希望只是刪除衝突標誌和Sally的修改—當她收到三明治時,會非常的吃驚。所以你應該走到她的辦公室或是拿起電話告訴Sally,你沒辦法從從義大利熟食店得到想要的泡菜。一旦你們確認了提交內容後,修改檔案並且刪除衝突標誌。

Top piece of breadMayonnaiseLettuceTomatoProvoloneSalamiMortadellaProsciuttoCreole MustardBottom piece of bread現在執行svn resolved,你已經準備好提交了:

$ svn resolved sandwich.txt$ svn commit -m "Go ahead and use my sandwich, discarding Sally's edits."記住,如果你修改衝突時感到混亂,你可以參考subversion生成的三個檔案—包括你未作更新的檔案。你也可以使用第三方的合併工具檢驗這三個檔案。

拷貝覆蓋你的工作檔案
如果你只是希望取消你的修改,你可以僅僅拷貝Subversion為你生成的檔案替換你的工作拷貝:

$ svn updateC  sandwich.txtUpdated to revision 2.$ ls sandwich.*sandwich.txt  sandwich.txt.mine  sandwich.txt.r2 sandwich.txt.r1$ cp sandwich.txt.r2 sandwich.txt$ svn resolved sandwich.txt下注:使用svn revert
如果你得到衝突,經過檢查你決定取消自己的修改並且重新編輯,你可以恢復你的修改:

$ svn revert sandwich.txtReverted 'sandwich.txt'$ ls sandwich.*sandwich.txt注意,當你恢復一個衝突的檔案時,不需要再執行svn resolved。

現在我們準備好提交修改了,注意svn resolved不像我們本章學過的其他命令一樣需要引數,在任何你認為解決了衝突的時候,只需要小心執行svn resolved,—一旦刪除了臨時檔案,Subversion會讓你提交這檔案,即使檔案中還存在衝突標記。

提交你得修改
最後!你的修改結束了,你合併了伺服器上所有的修改,你準備好提交修改到版本庫。

svn commit命令傳送所有的修改到版本庫,當你提交修改時,你需要提供一些描述修改的日誌資訊,你的資訊會附到這個修訂版本上,如果資訊很簡短,你可以在命令列中使用--message(-m)選項:

$ svn commit --message "Corrected number of cheese slices." Sending sandwich.txt Transmitting file data . Committed revision 3.

然而,如果你把寫日誌資訊當作工作的一部分,你也許會希望通過告訴Subversion一個檔名得到日誌資訊,使用--file選項:

$ svn commit --file logmsg Sending sandwich.txt Transmitting file data . Committed revision 4.

如果你沒有指定--message或者--file選項,Subversion會自動地啟動你最喜歡的編輯器來編輯日誌資訊。

版本庫不知道也不關心你的修改作為一個整體是否有意義,它只檢查是否有其他人修改了同一個檔案,如果別人已經這樣做了,你的整個提交會失敗,並且提示你一個或多個檔案已經過時了:

$ svn commit --message "Add another rule" Sending rules.txt svn: Commit failed (details follow): svn: Out of date: 'rules.txt' in transaction 'g'

此刻,你需要執行svn update來處理所有的合併和衝突,然後再嘗試提交。

我們已經覆蓋了Subversion基本的工作週期,還有許多其它特性可以管理你得版本庫和工作拷貝,但是隻使用前面介紹的命令你就可以很輕鬆的工作了。