這里列舉下我遇到的一些問題和解決辦法:
問題1:
svn add整個文件夾的時候,發現文件夾中的.a文件被忽略了,沒有add成功
解決辦法:
這是因為svn的默認配置中,忽略了特定類型的文件。
具體的我們查看home目錄下的.subversion/config文件,找到global-ignores字段,該字段默認是注釋掉的,我們取消掉注釋,然后把其中需要加入版本庫管理的類型(如*.a)刪除掉。(默認是# global-ignores = *.o *.lo *.la *.al *.libs *.so *.so.[0-9] *.a .pyc .pyo ## ..rej .rej .~ ~ .# *.swp .DS_Store)
問題2:
svn commit/add/info xxx@2x.pdf時報錯“a peg revision is not allowed here”
解決辦法:
這是因為文件名中包含了@,在svn中會默認把@后面的文字作為revision號(比如查看svn info xxx.txt@12345,svn會理解為查看xx.txt在revision號為12345時的信息)。
所以我們想讓svn把@看做文件名的一部分,有三種方法:
a.在@前加入\,即svn info/commit xxx@2x.pdf;
b.在文件名后面再加一個@,即svn info/commit xxx@2x.pdf@,因為svn只會以最后一個@為分割;
c.如果只是提交代碼啥的,可以在文件的上一級提交整個文件夾,svn在處理這個文件夾里的所有文件時,會自動把文件名解析成 xxx@2x.pdf。
問題3:
svn delete后,再重新checkout代碼,被delete的文件又出來了
解決辦法:這是因為svn delete后只是本地庫已經被刪除了,還要通過svn commit -m "xxx"提交到服務器,才表示svn服務器上是文件已被刪除
問題4:
svn操作時,提示Item xxx is out of date
解決辦法:這是因為本地的文件已經不是最新版本的文件,需要先svn update,更新本地庫,再進行svn操作
應用場景代碼:
場景一:
本地B文件夾已在版本控制中,下載需要把B文件夾中的內容全部替換為A文件夾中的內容,并保證版本庫控制正常。
#python腳本實現
#coding:utf-8
#!/usr/bin/python
import os
import shutil
#首先update B文件夾
os.system("svn update B ")
#把本地的B文件夾刪除
os.system("rm -rf B")
#把A文件夾下的內容拷貝到B文件夾下(此時B文件夾已不存在,會自動創建,然后ignore參數用來限制不用拷貝的文件)
shutil.copytree(A, B, ignore=shutil.ignore_patterns('.svn', '.DS_Store'))
#強制add,并commit
os.system("svn --force add B")
os.system("svn commit B -m 'commit xxx' ")
#經過上述步驟后,只有svn服務器端還存在,但實際應該被刪除的文件需要處理了;首先找出這部分文件(!表示文件或目錄在本報控制下,但本地文件已經丟失或不完整)
fileLists = os.popen("svn status B |grep '!'|awk '{print $2}'" ).readlines()
#然后逐一刪除
for item in fileLists:
deleteCmd = "svn delete %s " % item
os.system(deleteCmd)
#然后再整體commit一下
os.system("svn commit B -m 'delete xxx' )
問題5:
報錯“local file unversioned, incoming file add upon update”
問題原因: 把同一個文件m,checkout到A和B兩處,在A下面修改m并commit,在B下面先svn delete m,然后執行svn update就會報這個錯
解決辦法:在B目錄下執行:
svn resolve --accept working m
svn revert .
svn update
就可以了。
后面使用過程中會持續更新總結。