簡體   English   中英

如何定義hg忽略異常?

[英]How to define hg ignore exceptions?

gitignore能夠通過使用可選前綴來定義忽略異常 例如 ,為了不忽略特定文件foo.dll

*.dll        # Exclude all dlls
!foo.dll     # Except for foo.dll 

我們怎樣才能在hgignore定義這樣的異常?

Mercurial只允許異常忽略在定義忽略模式的同一規則中編碼的模式(通常通過(?!...)(?<!...)或類似的正則表達式構造),即使它的匹配引擎功能強大得多(原則上可以匹配文件大小和hg help filesets集中指定的其他內容)。

這有兩個原因,可組合性和性能。

組合性

如果您有模式的包含/排除系統,那么訂購很重要。 Mercurial有各種忽略文件的來源:存儲庫中的hgrc文件,以及Mercurial處理的.hgignore文件中的任何ui.ignoreui.ignore.*選項,以及上面的include:指令包含的每個文件名單。 允許規則以令人驚訝的方式跨各種忽略文件相互交互可能導致難以調試的令人驚訝的情況。 或者,一種模式(包含或排除)可以優先於其他模式,但這會產生其自身的問題。

性能

Mercurial使用忽略文件來修剪目錄樹遍歷。 如果目錄與忽略規則匹配,則會完全跳過該目錄(例如,包含數千個臨時文件的構建輸出目錄)。 如果您具有與目錄匹配的忽略模式,但也是與目錄中的文件匹配的異常,則您可以選擇不修剪目錄walk或忽略目錄的異常(Git選擇執行后者)。 不修剪目錄遍歷是低效的,忽略目錄中的異常嚴重限制了正則表達式尚未處理的用例數量。

解決方案和解決方法

Mercurial和Git之間的一個主要區別是Mercurial提供了除了glob模式之外還使用Python的擴展正則表達式的選項(Git僅使用glob模式)。 正則表達式消除了大多數(但不是全部)用例的異常需求。

這些情況通常通過.hgignore文件中的re:(?!exception)pattern行充分處理(在某些情況下,還有其他高級正則表達式模式)。 請注意, (?x)元模式忽略了未轉義的空白和正則表達式中的注釋,可以使復雜表達式更具可讀性。 例如,以下兩個是等效的:

re:(?x) (^|/) (?!foobar) foo # do not ignore files starting with `foobar`.
re:(^|/)(?!foobar)foo

這對於忽略文件非常有效,因為文件模式很少包含空格或哈希符號。 另請注意,即使您通常使用syntax: glob ,也可以通過在re:regexp:前面添加前綴來逐行切換到正則表達式語法。

如果這不夠,可以通過擴展修改現有行為,如果沒有合理適用的其他選項。 您可以覆蓋mercurial.dirstate.dirstate.{_ignore,_dirignore}或者您可以根據(例如) .hginclexcl文件自動將-I/-X選項添加到相關命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM