2009-07-16 234 views
27

使用svn:ignore屬性,有沒有一種方法可以根據我不想忽略的模式來指定要忽略的內容?換句話說,我想忽略所有的,但是以.xyz結尾的文件。我會如何去做(如果甚至可能的話)?使用svn:忽略忽略某些文件的所有內容

我探索過的一個選項是提交我想要版本化的所有東西,然後將目錄中的svn:ignore屬性設置爲'*',這意味着沒有其他文件,但是我已經提交的文件將被版本化。這是最好的我可以想出,但它感覺骯髒,如果我曾經需要添加另一個文件版本,我不得不作出多個提交...一個刪除svn:忽略屬性,另一個添加/提交新文件,然後第三個將svn:ignore更改爲'*'。

您的想法?

回答

10

不,沒有像你所描述的獨家匹配。 This article列出了模式匹配的可能性。它不限於:

  • ? - 匹配任何單個字符
  • * - 匹配字符的任意字符串,包括空字符串
  • [ - 開始一個字符類定義由]終止,用於匹配的一個子集的字符

類似的問題被問到已經here

0

好了,我不知道如果我錯過了什麼,但你可以使用任何方式你想要的:

svn propset svn:ignore "*~" . 

您可以檢查有:

svn propget svn:ignore . 

另一種方法是使用別名/腳本,可以在提交時進行復雜的解析。

我發現自己使用的最佳解決方案是將源文件的版本化樹與構建樹完全分開。這樣你就不會在目錄的版本化樹中生成東西。然後,您只能使用svn:ignore來忽略文本編輯器生成的簡單人工製品。

編輯:

對不起我的第一個解決方案的錯誤,我誤解你的帖子。其他兩種方式似乎相關,即使不完全是你想要的...

+0

雖然我認爲你的第一個解決方案是關於某件事的。你可以設想svn:忽略一個正則表達式匹配除了以「.xyz」結尾的文件之外的所有內容嗎? – jprete 2009-07-16 14:17:51

+0

@jprete不幸的是,不允許正則表達式。模式匹配基於fnmatch。 – whaley 2009-07-17 13:44:54

7

這是我所知道的唯一解決方案。您可以明確地添加文件,即使它們被忽略。

雖然您需要在所有子目錄中添加該設置。

# Create a repository with property ignore * 

[[email protected] ~] cd /tmp 
[[email protected] /tmp] svnadmin create foo 
[[email protected] /tmp] svn co file:///tmp/foo co 
Checked out revision 0. 
[[email protected] /tmp] cd co 
[[email protected] co] svn propset svn:ignore \* . 
property 'svn:ignore' set on '.' 

# Create 3 files 

[[email protected] co] touch a 
[[email protected] co] touch b 
[[email protected] co] touch c 

# We can add all 3 of these files in one transaction 

[[email protected] co] svn status 
M  . 
[[email protected] co] svn add a 
A   a 
[[email protected] co] svn add b 
A   b 
[[email protected] co] svn status 
M  . 
A  a 
A  b 
[[email protected] co] svn add c 
A   c 
[[email protected] co] svn ci 
Sending  . 
Adding   a 
Adding   b 
Adding   c 
Transmitting file data ... 
Committed revision 1. 
+1

感謝您的提示。我沒有意識到你可以顯式添加文件,顯然`svn add`忽略svn:ignore。 – whaley 2009-07-17 13:42:50

+0

對於TortoiseSVN(1.8)用戶,如果您嘗試通過gui添加忽略的文件,它會讓您生氣,但您可以通過命令行執行此操作。 – AlexMA 2013-09-04 18:18:20

17

看一看http://www.thoughtspark.org/node/38。顯然你可以使用「!」在字符組中否定其含義。所以如果你想忽略除了以。Java中,設置以下模式的svn:忽視:

*[!j][!a][!v][!a] 
*.java?* 
5

這是我對bin文件夾設置爲svn:ignore屬性匹配除了APK文件的所有內容:

*[!a][!p][!k] 
*a[!p][!k] 
*ap[!k] 

如果將有充分的RegExp支持你可以使用負面後顧,但是很少實現(例如不在JavaScript中)並且效率低下。

4

以下爲我工作,並擺脫了其他建議的幾個怪癖。

*.? 
*.?? 
*.??? 
*.[!j]??? 
*.?[!a]?? 
*.??[!v]? 
*.???[!a] 
*.?????* 

一行說明的行如下:

  • 忽略了一個字母的擴展
  • 不顧一切,有一個兩個字母的擴展
  • 不顧一切有三個一切字母擴展名
  • 忽略擴展名的第一個字母不是j的所有擴展名爲四個字母的文字
  • 忽略具有四個字母的擴展都在擴展的第二個字母不是
  • 不顧一切,有一個四個字母的擴展,其中擴展的第三個字母不是V
  • 忽略,有一個四個字母的擴展一切凡拓的第四個字母不是
  • 忽略具有五個字母的擴展名以上

限制的一切:

  • 該W生病也阻止以.java結尾的目錄
  • 不幸的是我不能忽略沒有擴展名的文件,因爲那樣會阻塞目錄。