svn提交時遇到的幾個問題
svn其實已經是各個IDE整合得很成熟的外掛了,通過svn提交/更新程式碼已成家常便飯。但是有時候也不免要通過命令列提交,比如我們的程式碼編輯是直接在伺服器上進行,沒有執行任何IDE,此時就需要熟練的svn操作能力。這個過程不免要遇到些問題。下面就談談我們遇到過的一些問題:
1.檔名中包含@符號
這在ios圖片命名中常遇到,如果直接使用svn add [email protected]
增加到提交列表,則會報錯。因為@
符號在svn中表示後面將制定版本號。
shell中一般的轉義對@
符號是不起作用的。svn設計者也考慮到了這個問題,只要在檔名末尾再加上一個@
符號就好了。最終的命令是:
svn add
2.檔名中包含空格
有些大意的同學(可能是設計師,也可能是程式設計師)在改名時,在檔名中加了個空格。這對Linux來說是會出問題的。因為空格是引數的間隔符號,換言之,空格之後的字串會當作另一個引數對待。所以一箇中間有空格的檔名就被認為是兩個檔案。這個其實好解決。把整體用雙引號包裝起來就OK了。
3.批量操作
如果一個大型專案,或者本次提交的改動檔案較多,一般來說是不可能一個一個檔案的放到svn命令裡去的,否則BOSS會以為你怠工:)。此時批量操作就是必須的了。比如:
for i in `svn st | grep ^? | sed 's/?//'`; do svn add $i; done
上面操作的意思是:將所有新檔案標記一下,等會兒要提交到版本庫。下面分解一下:
for i in ... ; do ...$i; done
這個不必解釋了吧,所有不寫程式的人都知道這是什麼意思。注意哦,這個是shell命令,不是svn命令喲,svn的執行也是遵循shell的執行規範的。另外,前面定義的迴圈變數i
在do中使用時需要加上$
符號,不然shell不知道你是什麼意思,迴圈也就沒有意義。svn st
是表示檢視當前svn工作區狀態,從這裡可以看到哪些檔案是新增的,哪些是改動過的,哪些是要刪除的grep ^?
表示篩選以?開頭的檔案sed 's/?//'
是刪除問號?`svn st | grep ^? | sed 's/?//'`
i
將依次代表反引號整體執行結果的每一行。
for迴圈操作適用於很多時候,掌握這個東西,shell程式設計就搞定1/3了,再找個時間把test(就是各種if所依賴的測試方法)搞定,那就可以讓系統管理員捲鋪蓋了 -_-。但是,要知道迴圈不同次的迭代執行是沒有獨立的,所以最好不要拿這種方法來進行提交,不然會生成很多版本,那時你的千古罵名就背定了。
那麼,問題來了:這些檔名中包含@
符號怎麼辦?
很簡單,在迴圈執行體內的$i後加上@
即可:for i in `svn st | grep ^? | sed 's/?//'`; do svn add $i@; done