我自己犯過的一個錯誤是:/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基本的工作周期,還有許多其它特性可以管理你得版本庫和工作拷貝,但是隻使用前面介紹的指令你就可以很輕松的工作了。