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基本的工作週期,還有許多其它特性可以管理你得版本庫和工作拷貝,但是隻使用前面介紹的命令你就可以很輕鬆的工作了。