天天看點

svn常見問題,報錯,指令及總結,svn常見問題

我自己犯過的一個錯誤是:/svn/MyERP_core_Main/!svn/act/b8bd621b-c193-4969-b66c-d35f11009815 後來證明是位址的大小寫問題,我修改了大小寫,然後删掉了本地的檔案,check out伺服器的檔案,然後送出和更新就好了,麻煩之處在于,你需要重新将檔案修改,然後送出上去。  

svn更換送出位址:svnswitch --relocatehttp://1.1.5.54:8080/svn/MyERP_Core_Main/MyERP_Core/trunk/trunk_ios5x_1_2http://1.1.5.54:8080/svn/MyERP_Core_Main/MyERP_Core/trunk/trunk_ios5x_1_2

svn某一檔案(BillUIDeviceFunction.m)存在沖突,我就将舊檔案拷出來直接取代新檔案 然後再用:svn resolved BillUIDeviceFunction.m Resolved conflictedstate of 'BillUIDeviceFunction.m'

這個svn resolves指令告訴系統沖突已經解決請忽略。

svn add foobar 時出現xx is already under versioncontrol 我的方法是:先添加,再送出,記得要層層add然後送出一遍 舉例:HummingBird/Config_Vehicle/Mobile/Vehicle,Config_Vehicle是新檔案夾,在HummingBird svn add Config_Vehicle,然後svncommit -m " " 然後再cd到Config_Vehicle svn add Mobile 一層層add commit下去,貌似是這樣,如果不行就運作下邊的代碼删除隐藏的.svn檔案,再試。

find . -name ".svn" |xargs rm -Rf

知識點-1013-7-19

問題1:’.’ is not a working copy.Can’t open file‘.svn/entries’: 系統找不到指定的路徑。

解答:原因是輸入的通路路徑不正确,如svn://192.168.6.200/如果最後少寫了“/”,就會出現這種錯誤提示。

問題2:将檔案checkout之後,沒有出現SVN的圖示,是怎麼回事?

解答:有些時候在用戶端Checkout檔案後,SVN的系統圖示也會不顯示,可以執行一下“Cleanup”,就會出現SVN的系統圖示。

問題3:為什麼添加的檔案,别人看不到,版本庫裡也沒有?

解答:最可能的原因是,你隻是執行了“Add”而沒有“Commit”,這樣隻是在本地注明某個檔案是預定要增加的,而沒有實際添加到版本庫中,要添加到版本庫必須執行“Commit”。删除檔案也是一樣。

問題4:“Commit failed。……You have toupdate your working copyfirst”  送出失敗,需要首先執行更新操作。

解答:多人同時修改同一檔案,在送出前其他人已經搶先送出到SVN伺服器中,導緻該錯誤;解決方法:對工作複本中的檔案進行更新即可。

問題5:更新時提示檔案發生沖突:“One ormore files are not a conflicted state。”

解答:多人同時修改同一檔案的同一部分,SVN無法自動進行合并,會導緻該錯誤;解決方法:對工作複本中的檔案和伺服器的檔案進行比較,手工合并即可。

問題6:“Commit failed;File alreadyexists”送出失敗,檔案**已存在。

解答:版本管理系統在改變你的計算機上的工作副本時,是非常的小心的。在做任何事情之前,它都盡可能把您的意圖寫到你的計算機上的日志檔案中去。但如果偶然地操作中斷了(例如:突然停電了,您的計算機當機了),那麼日志檔案記錄就可能同您最後的工作狀态不一緻。一種建議解決途徑:先把要送出的東西拷出來放到其它目錄,再更新本地檔案,然後把拷出來的檔案重新放回去送出。

問題7:Working copy’**’locked.Please execute the ’Clean up’command.

解答:Subversion用戶端在送出内容之前會在本地的工作拷貝寫日志,防止其他用戶端再次作操作,如果這個送出過程中發生錯誤,就會存在未清理的日志,解決這個問題之需要執行“清理”操作,整理你的計算機上的工作副本,清理錯誤的日志記錄,使您可以繼續操作。

問題8:執行cleanup時,出現錯誤“Subversion reported an error while doing a cleanup!” '**'is not a working copy directory ”

解答:遇到這種情況,先删除隐藏檔案夾.svn中的tmp下面的臨時檔案,再執行cleanup。

問題9:因為倉庫與目錄很多,使用TSVN每次選擇目錄URL ofrepository有很多位址,如何才清除呢?像清除浏覽器中的曆史那樣,用什麼方法呢?

解答:右鍵->TortoiseSVN->Settings->SavedData,就可以清除你想要的東西了,包括URL、log、視窗大小、密碼緩存等。

問題10:在SVN中選中一個目錄showlog時,出現了某些版本隻顯示版本号和(nodate),沒有其他資訊,什麼原因引起的?

解答:出現了(no date)的revision,為其他人修改了你所沒有權限通路的某個目錄下的檔案。

問題11:Attempted to lock analready-locked dir       is not under versioncontrol

      I deleted the log file in the .svn directory (I also deleted theoffending file in .svn/props-base)

      Then did acleanup..          Then resumed my update.

問題12:svn: warning: 'xxxxx' isalready under version control解決辦法?

   隻添加相應目錄到SVN,但不添加目錄下的檔案: 

    #svn stuploads|grep ^?|awk "{print /$2}"|xargs svn add -N

   原因:  很可能是 .svn 隐藏目錄版本資訊被修改了

    解決辦法:

   删除uploads目錄下的.svn目錄及下面的檔案(保留uploads目錄的.svn)

    #finduploads |grep 'uploads/[^/.]*/.svn'|xargs rm -rf

或者:find. -name ".svn" |xargs rm -Rf  

Mac svn指令linux同樣适用

1、将檔案checkout到本地目錄

svn checkoutpath(path是伺服器上的目錄)

例如:svn checkout svn://192.168.1.1/pro/domain

簡寫:svn co

2、往版本庫中添加新的檔案或檔案夾

svn add file

例如:svn add test.php(添加test.php)

svn add *.php(添加目前目錄下所有的php檔案)

3、将改動的檔案送出到版本庫

svn commit-m “LogMessage“ [-N] [--no-unlock]PATH(如果選擇了保持鎖,就使用–no-unlock開關)

例如:svn commit -m “add test file for my test“ test.php

簡寫:svn ci

4、加鎖/解鎖

svn lock -m “LockMessage“ [--force] PATH

例如:svn lock -m “lock test file“ test.php

svn unlock PATH

5、更新到某個版本

svn update -r mpath

例如:

svn update如果後面沒有目錄,預設将目前目錄以及子目錄下的所有檔案都更新到最新版本。

svn update -r 200 test.php(将版本庫中的檔案test.php還原到版本200)

svn updatetest.php(更新,于版本庫同步。如果在送出的時候提示過期的話,是因為沖突,需要先update,修改檔案,然後清除svnresolved,最後再送出commit)

簡寫:svn up

6、檢視檔案或者目錄狀态

1)svn status path(目錄下的檔案和子目錄的狀态,正常狀态不顯示)

【?:不在svn的控制中;M:内容被修改;C:發生沖突;A:預定加入到版本庫;K:被鎖定】

2)svn status -v path(顯示檔案和子目錄狀态)

第一列保持相同,第二列顯示工作版本号,第三和第四列顯示最後一次修改的版本号和修改人。

注:svn status、svn diff和 svnrevert這三條指令在沒有網絡的情況下也可以執行的,原因是svn在本地的.svn中保留了本地版本的原始拷貝。

簡寫:svn st

7、删除檔案

svn delete path -m “deletetest fle“

例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete testfile”

或者直接svn delete test.php 然後再svn ci -m ‘delete testfile‘,推薦使用這種

簡寫:svn (del, remove,rm)

8、檢視日志

svn log path

例如:svn log test.php 顯示這個檔案的所有修改記錄,及其版本号的變化

9、檢視檔案詳細資訊

svn info path

例如:svn info test.php

10、比較差異

svn diff path(将修改的檔案與基礎版本比較)

例如:svn diff test.php

svn diff -r m:n path(對版本m和版本n比較差異)

例如:svn diff -r 200:201 test.php

簡寫:svn di

11、将兩個版本之間的差異合并到目前檔案

svn merge -r m:n path

例如:svn merge -r 200:205test.php(将版本200與205之間的差異合并到目前檔案,但是一般都會産生沖突,需要處理一下)

12、SVN 幫助

svn help

svn help ci

13、版本庫下的檔案和目錄清單

svn list path

顯示path目錄下的所有屬于版本庫的檔案和目錄

簡寫:svn ls

14、建立納入版本控制下的新目錄

svn mkdir: 建立納入版本控制下的新目錄。

用法: 1、mkdir PATH…

2、mkdir URL…

建立版本控制的目錄。

1、每一個以工作副本 PATH 指定的目錄,都會建立在本地端,并且加入新增

排程,以待下一次的送出。

2、每個以URL指定的目錄,都會透過立即送出于倉庫中建立。

在這兩個情況下,所有的中間目錄都必須事先存在。

15、恢複本地修改

svn revert: 恢複原始未改變的工作副本檔案 (恢複大部份的本地修改)。revert:

用法: revert PATH…

注意: 本子指令不會存取網絡,并且會解除沖突的狀況。但是它不會恢複

被删除的目錄

16、代碼庫URL變更

svn switch (sw): 更新工作副本至不同的URL。

用法: 1、switch URL [PATH]

2、switch –relocate FROM TO [PATH...]

1、更新你的工作副本,映射到一個新的URL,其行為跟“svn update”很像,也會将

伺服器上檔案與本地檔案合并。這是将工作副本對應到同一倉庫中某個分支或者标記的

方法。

2、改寫工作副本的URL中繼資料,以反映單純的URL上的改變。當倉庫的根URL變動

(比如方案名或是主機名稱變動),但是工作副本仍舊對映到同一倉庫的同一目錄時使用

這個指令更新工作副本與倉庫的對應關系。

17、解決沖突

svn resolved: 移除工作副本的目錄或檔案的“沖突”狀态。

用法: resolved PATH…

注意: 本子指令不會依文法來解決沖突或是移除沖突标記;它隻是移除沖突的

相關檔案,然後讓 PATH 可以再次送出。

18、輸出指定檔案或URL的内容。

svn cat 目标[@版本]…如果指定了版本,将從指定的版本開始查找。

svn cat -r PREV filename > filename (PREV是上一版本,也可以寫具體版本号,這樣輸出結果是可以送出的)

Aborting commit: 'XXXXXXXX'remains in conflict錯誤

今天在送出項目檔案到本地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 inconflict查了一下SVN的手冊才知道原來是多個版本之間遇到沖突。此時你需要解決沖突(合并别人的修改)。

--------------------------------------------------------------------------------

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

$ svn update C sandwich.txt Updated to revision 2. $ ls -1sandwich.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>來放棄所有的修改。

一旦你解決了沖突,你需要通過指令svnresolved讓Subversion知道,這樣就會删除三個臨時檔案,Subversion就不會認為這個檔案是在沖突狀态了。

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

手工合并沖突

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

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

$ cat sandwich.txtTop piece ofbreadMayonnaiseLettuceTomatoProvolone<<<<<<<.mineSalamiMortadellaProsciutto=======SauerkrautGrilledChicken>>>>>>>.r2Creole MustardBottom piece ofbread小于号、等于号和大于号串是沖突标記,并不是沖突的資料,你一定要确定這些内容在下次送出之前得到删除,前兩組标志中間的内容是你在沖突區所做的修改:

<<<<<<<.mineSalamiMortadellaProsciutto=======後兩組之間的是Sally送出的修改沖突:

=======SauerkrautGrilledChicken>>>>>>>.r2通常你并不希望隻是删除沖突标志和Sally的修改—當她收到三明治時,會非常的吃驚。是以你應該走到她的辦公室或是拿起電話告訴Sally,你沒辦法從從意大利熟食店得到想要的泡菜。一旦你們确認了送出内容後,修改檔案并且删除沖突标志。

Top piece ofbreadMayonnaiseLettuceTomatoProvoloneSalamiMortadellaProsciuttoCreoleMustardBottom piece of bread現在運作svn resolved,你已經準備好送出了:

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

拷貝覆寫你的工作檔案

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

$ svnupdateC  sandwich.txtUpdatedto revision 2.$ lssandwich.*sandwich.txt  sandwich.txt.mine  sandwich.txt.r2 sandwich.txt.r1$cp sandwich.txt.r2 sandwich.txt$ svn resolved sandwich.txt下注:使用svnrevert

如果你得到沖突,經過檢查你決定取消自己的修改并且重新編輯,你可以恢複你的修改:

$ svn revert sandwich.txtReverted 'sandwich.txt'$ lssandwich.*sandwich.txt注意,當你恢複一個沖突的檔案時,不需要再運作svn resolved。

現在我們準備好送出修改了,注意svnresolved不像我們本章學過的其他指令一樣需要參數,在任何你認為解決了沖突的時候,隻需要小心運作svnresolved,—一旦删除了臨時檔案,Subversion會讓你送出這檔案,即使檔案中還存在沖突标記。

送出你得修改

最後!你的修改結束了,你合并了伺服器上所有的修改,你準備好送出修改到版本庫。

svncommit指令發送所有的修改到版本庫,當你送出修改時,你需要提供一些描述修改的日志資訊,你的資訊會附到這個修訂版本上,如果資訊很簡短,你可以在指令行中使用--message(-m)選項:

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

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

$ svn commit --file logmsg Sending sandwich.txt Transmitting filedata . 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' intransaction 'g'

此刻,你需要運作svn update來處理所有的合并和沖突,然後再嘗試送出。

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