如何使用 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 手册的各个部分,以便未来的读者可以轻松找到它。

相关内容