1. 程式人生 > >svn提交時遇到的幾個問題

svn提交時遇到的幾個問題

svn其實已經是各個IDE整合得很成熟的外掛了,通過svn提交/更新程式碼已成家常便飯。但是有時候也不免要通過命令列提交,比如我們的程式碼編輯是直接在伺服器上進行,沒有執行任何IDE,此時就需要熟練的svn操作能力。這個過程不免要遇到些問題。下面就談談我們遇到過的一些問題:

1.檔名中包含@符號

這在ios圖片命名中常遇到,如果直接使用svn add [email protected]增加到提交列表,則會報錯。因為@符號在svn中表示後面將制定版本號。

shell中一般的轉義對@符號是不起作用的。svn設計者也考慮到了這個問題,只要在檔名末尾再加上一個@符號就好了。最終的命令是:

svn add

[email protected]@

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/?//'`
    兩側的反引號(ESC鍵正下方的那個鍵)包起來的內容將做為整體執行結果返回,當前是返回給for迴圈。因此,for迴圈中的自變數i將依次代表反引號整體執行結果的每一行。

for迴圈操作適用於很多時候,掌握這個東西,shell程式設計就搞定1/3了,再找個時間把test(就是各種if所依賴的測試方法)搞定,那就可以讓系統管理員捲鋪蓋了 -_-。但是,要知道迴圈不同次的迭代執行是沒有獨立的,所以最好不要拿這種方法來進行提交,不然會生成很多版本,那時你的千古罵名就背定了。

那麼,問題來了:這些檔名中包含@符號怎麼辦?

很簡單,在迴圈執行體內的$i後加上@即可:for i in `svn st | grep ^? | sed 's/?//'`; do svn add $i@; done