2010-09-03 88 views
13

我正在使用Mercurial管理$ HOME,以保持我的點文件的完整性和跟蹤性,或至少對我來說很重要。如何忽略除使用.hgignore之外的所有目錄?

然而,有很多文件和目錄在〜不需要跟蹤,而且這個設置是不斷變化和不斷增長的。

從歷史上看,我已經有這個.hgignore處理這個:

syntax: glob 
* 

這使我的狀態乾淨,儘可能去,使得只有先前跟蹤的可視文件。但是,我有一些目錄(在我的例子中,scripts.emacs.d),我希望看到未跟蹤的文件;我幾乎總是想跟蹤這些目錄的新增加。

我知道我可以運行hg st -u scripts來識別未跟蹤的文件,但我想要一種方法來使用plain ole hg status來實現相同的功能。

有沒有辦法做到這一點?

回答

17

.hgignore代替試試這個:

syntax: regexp 

^(?!(scripts|foo|bar)/)[^/]+/ 
  • ^比賽開始路徑的
  • (?!(scripts|foo|bar)使用負先行忽略,除了那些在目錄中scriptsfoobar
  • /)確保所有文件以追蹤目錄作爲前綴的目錄被忽略
  • [^/]+/後來居然匹配任何目錄(不包括那些由先行排除了),所以在~文件不會被忽略

信用對該解決方案的中心思想(負前瞻)去拉邁克爾Voie的回答this question

+0

這是大部分解決方案,但〜中的所有文件仍然顯示,這是至少是嘈雜的。我沒有跟蹤每個dotfile文件(其中最重要的是,因爲有太多的軟件包堅持把它們放在我的目錄中)。 – 2010-09-07 14:12:58

+1

除非您可以使用文件名模式來區分目錄中的點文件(無法忽略),否則我認爲您運氣不佳。 Mercurial文檔說,如果一個路徑'a/b/c'不能匹配'.hgignore'模式,那麼對'a/b'和如果失敗'a'都會嘗試相同的模式。因此根目錄中的文件和目錄只能通過拼寫方式來區分。如果只有少數被跟蹤的目錄以點開頭,那麼你可以手動添加這些目錄和'.hgignore'開頭的所有其他目錄。 – shambulator 2010-09-08 10:35:59

8

這個問題在這裏已經問過很多次了,你會用零寬度的負面預測斷言,一個經常濫用的正則表達式技巧得到很多令人費解的答案,但更好的解決方案(a)僅在該目錄中製作回購,或者(b)只在該目錄中添加文件。對於選項(b),您只需在.hgignore文件中放入.*即可忽略所有內容,然後手動hg add要跟蹤的文件。在mercurial中,與svn和cvs不同,您可以使用add來覆蓋忽略。

+0

在該目錄中創建回購不會跟蹤根目錄中的文件,也不會打開跟蹤同一回購庫中其他目錄的選項。使用lookahead有什麼問題? – shambulator 2010-09-03 21:01:08

+0

沒什麼不對,它很複雜,很少做。大多數人只是'hg add'異常,如果他們希望.hgignore是白名單而不是黑名單,那麼就會忽略所有的異常。 – 2010-09-04 19:17:27

+0

夠公平 - 我不否認花了幾次嘗試纔得到正確的正則表達式,這就是假設我沒有錯過某個角落的情況下:)每一個你得到正確的幫助你與下一個,但!這樣,你就可以使用'hg status'和'hg addremove'。 – shambulator 2010-09-05 21:51:57

相關問題