2009-12-31 51 views
34

當我嘗試這樣執行命令(命令行或Perl腳本 - 這並不重要):爲什麼Subversion跳過包含@符號的文件?

svn revert "build\[email protected]" 

SVN跳過此文件和輸出:

Skipped 'build\myfile' 

我試着這樣做:

svn revert "build\*.meta" 

但它給出了相同的結果。

我可以從GUI恢復這些文件。我可以做恢復這些文件(但它會恢復比我更想):

svn revert --recursive "build" 

對此有一個解決方法嗎?

回答

80

在Subversion的文件名的@符號實際上有一個特殊的意義 - 釘住修訂版本號。引述Subversion book

理解力的讀者在這一點上,peg修訂版本語法是否會導致對工作拷貝路徑或URL實際上有在他們的標誌問題可能會覺得奇怪。畢竟,svn如何知道news @ 11是我的樹中的一個目錄的名稱還是僅僅是「新聞修訂版11」的語法?值得慶幸的是,雖然svn總是會假設後者,但是有一個簡單的解決方法。您只需要在路徑的末尾附加一個at符號,例如news @ 11 @。 svn只關心參數中的最後一個符號,在sign之後省略字面peg修訂說明符並不認爲是非法的。此解決方法甚至適用於以符號結尾的路徑 - 您將使用filename @@來討論名爲filename @的文件。

所以,你應該一個@符號附加到文件名在腳本中,這樣的:

svn revert "build\[email protected]@" 
+0

使用下面的bhavinb腳本在目錄中的每個文件上執行此操作。偉大的劇本和偉大的答案阿維。 – 2010-12-01 02:02:06

+0

謝謝!我瘋了。 – Evert 2011-01-20 17:44:53

+0

+1非常感謝,我也瘋了^ _^ – Niko 2012-06-11 15:01:49

0

什麼操作系統?如果它是* nix系統,請嘗試用'single @ quotes'引用您的文件。

+0

它的窗口我的應用程序文件。單引號不起作用 - 你得到的輸出是這樣的: 跳過「構建」(即雙單引號) – 2009-12-31 12:40:27

+1

@Paulius:知道你的原始問題是什麼操作系統會有用。 – 2009-12-31 13:46:41

+0

另外,單引號技巧無論如何不適用於nix – Purrell 2012-08-14 23:08:44

22

我想補充以上正確答案,如果你有很多的文件用「@」符號在他們的名字,你希望在一個批處理過程(即使用*通配符),你可以在OS X的終端是這樣的(或任何Linux機器真的):

find . -name "*@*" | xargs -I % svn add %@ 

上面的命令將使用find實用程序在其中使用@列出每個文件然後使用XARGS將文件的路徑傳遞給SVN。 XARGS將用路徑替換每個出現的%,並在文件名末尾附加特殊的「@」,以便SVN接受它。

希望這有助於 - 我不得不捶我的頭有點添加gazzilion @ 2x.png需要有對於要升級爲IOS4.0

+0

這在第一次完美運行。衷心感謝你! – 2010-12-01 02:01:27

+0

這是一個救星。我實際上將它與svn stat |相結合grep「^?」 | awk'{print $ 2}'| xargs svn添加到svn stat | grep「^?」 | awk'{print $ 2}'| xargs -I%svn add%@ – Das 2012-08-07 02:17:02