如何使用 Unison 忽略所有檔案但不忽略子目錄?

如何使用 Unison 忽略所有檔案但不忽略子目錄?

我想同步給定根目錄的所有子目錄的內容,但只同步根目錄本身的幾個檔案。為此,我想忽略使用該ignore指令的所有檔案(保留所有子目錄)並重新新增我想與該ignorenot指令一起保留的幾個檔案。為此,我嘗試了以下兩件事:

  1. 透過添加到我的個人資料中,添加正規表示式以排除根目錄中包含斜杠的任何條目ignore = Regex ^(?!.*\/).*$。但這會導致錯誤訊息如下,沒有進一步的解釋:

    Malformed pattern "Regex ^(?!.*\/).*$"." 
    
  2. 首先忽略所有內容,ignore = Name ?*然後重新添加包含斜線的每個路徑ignorenot = Path */*,這沒有按預期工作,因為不忽略目錄不能以這種方式工作。

這似乎是一個非常簡單的問題,但我無法理解它。

答案1

看來不可能完全照你的意願去做。當 Unison 同步檔案與目錄時,Unison 可以區分兩者之間的差異,但 Unison 不會以允許/使用者與一個檔案進行模式匹配的方式以不同方式引用它們(例如,透過在目錄或其他內容中添加前綴)或其他。例如,如果您同步root 下名為 的目錄deer和名為 的文件,Unison 會將它們視為philROOT

new dir  ---->      ROOT/deer
new file ---->      ROOT/phil

你無法區分ROOT/deerROOT/phil。不過這裡有一些建議

  1. path = deer透過在每個目錄的設定檔中新增一行來手動指定要同步的目錄。我認為這是配置 Unison 的標準方法。然後,對於根目錄中您也想要同步的任何文件,例如名為 的文件phil,您可以移動phil到像這樣同步的目錄deer/synced-root-files/,然後添加符號連結從該檔案返回到您的根目錄

    cd ROOT; ln -s ROOT/deer/synced-root-files/phil
    
  2. 在根目錄中建立一個命名約定,您可以對其進行模式匹配。例如,僅命名所有文件想要同步類似的內容ignore.phil,並將一行新增到您的 Unison 設定檔中ignore = Path ignore.*

這是一個連結路徑規範忽略路徑Unison 手冊的各個部分,以便未來的讀者可以輕鬆找到它。

相關內容