2009-10-02 122 views
42

我需要一個.hgdontignore文件:-)來包含某些文件並排除目錄中的所有文件。基本上我只想將.jar文件包含在特定的目錄中,而不是其他的。我怎樣才能做到這一點?我不擅長正則表達式語法。或者我可以用glob語法來完成它嗎? (我更喜歡爲了便於閱讀)hgignore:幫助忽略除某些文件外的所有文件

就像一個示例位置,假設我想排除foo/bar/以外的所有文件,但foo/bar/*.jar除外。

回答

36

要做到這一點,你需要使用正則表達式:

foo/bar/.+?\.(?!jar).+ 

說明

你告訴它什麼忽略,所以這個表達式搜索的東西,你不要't想要。

  1. 你看他的名字(包括相對目錄)的任何文件包括(富/酒吧/)
  2. 你再去找它之前句號(。+?\任何字符。==匹配的一個或多個任何時間的字符,直到你到達週期字符)
  3. 然後確保它沒有「jar」結尾(?!jar)(這稱爲負面展望
  4. 最後你抓住它的結局(。+)

正則表達離子很容易混淆,所以我強烈建議你得到一個像Regex Buddy這樣的工具來幫助你建立它們。它會將正則表達式分解成簡單的英語,這真的有幫助。

編輯

Jason S,你抓住了我,它確實懷念那些文件。

該修正的正則表達式會爲你列出的每個例子的工作:

foo/bar/(?!.*\.jar$).+ 

它發現:

  • 富/酒吧/ baz.txt
  • 富/酒吧/巴茲
  • FOO/bar/jar
  • foo/bar/baz.jar.txt
  • foo/bar/ba z.jar。
  • foo/bar/baz。
  • foo/bar/baz.txt。

,但是沒有找到

  • 富/酒吧/巴茲。罐子

新解釋

這是說找文件中的「富/酒吧/」,然後如果有零個或多個字符後跟「的.jar」再沒有更多的字符不匹配($表示行的末尾),那麼,如果不是這種情況,則匹配任何後面的字符。

+0

whee!謝謝,現在我去嘗試一下。 – 2009-10-02 23:19:44

+1

嗯,好主意,但它不會像所述的那樣工作,因爲它不會匹配沒有任何擴展名的文件。但我認爲我可以將其變成我需要的東西。 'foo/bar /'部分很容易,所以暫時忘掉它。如果你可以修復它,使它匹配文件「baz.txt」,「baz」,「jar」,「baz.jar.txt」,「baz.jar。」,「baz。」和「baz.txt。 「但不是「baz.jar」,那麼我會接受。 :-) – 2010-02-03 16:54:56

+0

嘿傑森,我明白你的意思了。我剛剛用一個正常的正則表達式更新了我的答案。我對您列出的每個字符串進行了測試。 – 2010-02-03 18:51:47

41

從邁克爾的回答是一個很好的一個,但另一個選擇是隻排除:

foo/bar/** 

,然後手動添加.jar文件。您始終可以添加忽略規則排除的文件,並覆蓋忽略。你只需要記住添加你將來創建的任何罐子。

+0

你如何手動添加這些?使用「hg add」添加它們會失敗,因爲將使用忽略文件。使用「hg add -I」添加它們會失敗,因爲忽略文件仍然適用。那麼它們如何被添加覆蓋忽略文件呢? – Mecki 2009-10-20 15:13:21

+3

Mecki,使用'hg add'添加它們可以很好地工作 - 它會覆蓋忽略 - 只要您不在添加行中使用通配符。所以把foo/bar/**放在你的.hgignore裏,然後做'hg add foo/bar/path/specific.file',你就可以走了。如果你有大量的例外添加,你可以將'hg status -u -n foo/bar/lots - *。jar'管道擴展爲'xargs hg add',並批量進行顯式覆蓋。 – 2009-10-20 17:57:07

+1

如果有人會修改foo/bar/path/specific.file,它仍然會被忽略?它不是一個解決方案夥伴 – holms 2011-09-07 12:50:25

相關問題