Mac 下的安装

在 macOS 下安装 Unison,您可以选择几种不同的方法:

  1. 使用 Homebrew
    Homebrew 是 macOS 下的一个包管理器,可以用来安装许多开源软件。如果您已经安装了 Homebrew,可以通过以下命令来安装 Unison:
    brew install unison
    
  2. 使用 MacPorts
    如果您使用的是 MacPorts,可以通过以下命令来安装 Unison:
    sudo port install unison
    
  3. 下载预编译的二进制文件
    您可以直接从 Unison 的官方网站或 GitHub 仓库下载预编译的二进制文件。下载后,通常只需要将 Unison 的可执行文件移动到您的 /usr/local/bin 目录或者其他在您的 PATH 环境变量中的目录。
  4. 编译源代码
    如果您需要最新的特性或者想要自定义一些设置,您可以从源代码编译 Unison。这通常需要安装 OCaml 编程语言的编译环境和一些依赖库。您可以访问 Unison 的官方网站或 GitHub 仓库来获取源代码和编译指南。
    安装完成后,您可以通过终端运行 Unison。如果您需要图形界面,可以搜索第三方开发的 Unison 图形前端,如 "Unison GUI for OS X" 或其他类似的项目。
    请注意,安装和运行 Unison 可能需要您具有管理员权限,因此可能需要在命令前添加 sudo。此外,安装和配置过程可能会根据您的系统环境和 Unison 的版本有所不同。如果遇到问题,可以参考 Unison 的官方文档或社区提供的指南。

比如我有 a,b 两个文件夹,要求双向同步,增量方式,会忽略一些.DS_Store,.git,.cache 文件夹等,用 Unison 命令怎么写

要使用 Unison 来同步两个文件夹(例如 ab),并且希望以增量方式同步,同时忽略特定的文件和文件夹(如 .DS_Store.git.cache 等),您可以使用以下命令格式:

unison PROFILE_NAME -batch -auto -silent -repeat watch -ignore 'Name *.DS_Store' -ignore 'Name .git' -ignore 'Name .cache'

这里的 PROFILE_NAME 应该替换为您在 Unison 配置文件中定义的配置名称,或者直接指定两个文件夹的路径。Unison 配置文件通常位于用户的 home 目录下的 .unison 文件夹中,例如 ~/.unison/default.prf
如果您没有预先配置文件,可以直接在命令中指定两个文件夹的路径,如下所示:

unison /path/to/a /path/to/b -batch -auto -silent -repeat watch -ignore 'Name *.DS_Store' -ignore 'Name .git' -ignore 'Name .cache'

这里的命令行参数解释如下:

  • /path/to/a/path/to/b 是您要同步的两个文件夹的路径。
  • -batch:批处理模式,不显示用户界面。
  • -auto:自动处理冲突,选择“预测的”动作。
  • -silent:静默模式,不输出非错误信息。
  • -repeat watch:监控源目录的变化,如有变化则重新同步。
  • -ignore 'Pattern':指定要忽略的文件或目录的模式。您可以根据需要添加多个 -ignore 参数来忽略不同的文件或目录。
    请注意,Unison 的同步是双向的,它会自动检测两个文件夹中的更改并同步它们。如果出现冲突,Unison 会尝试合并更改,但在某些情况下可能需要用户干预来决定如何处理冲突。
    在实际使用中,您可能需要根据实际情况调整命令行参数,以满足您的同步需求。此外,如果您的同步需求比较复杂,建议创建一个 Unison 配置文件来管理同步设置,这样可以更方便地维护和更新同步参数。

同步前,我可以预览一下,哪些文件会被同步吗

是的,Unison 允许您在执行实际同步之前预览将会发生的更改。这样可以让你在同步之前查看哪些文件将被传输、删除或更新,从而避免不必要的操作。
要预览同步操作,您可以使用 Unison 的 -preview 选项。以下是一个示例命令,用于预览两个文件夹(/path/to/a/path/to/b)之间的同步操作:

unison /path/to/a /path/to/b -preview

运行上述命令后,Unison 将比较两个文件夹并显示将要执行的同步操作的列表。这些操作包括:

  • 将要复制的文件。
  • 将要删除的文件。
  • 将要更新的文件。
    在预览模式下,Unison 不会实际修改任何文件或文件夹。这是为了让您有机会确认同步操作是否正确,并根据需要调整同步设置或手动处理任何潜在的冲突。
    预览完成后,如果您决定执行同步,可以再次运行 Unison 命令,但不包含 -preview 选项。如果您对 Unison 的配置文件进行了更改,可能需要重新运行带有 -testserver 选项的命令,以确保配置文件的更改已经生效。

Unison 安全吗?文件冲突它怎么处理?占用系统资源大吗

Unison 是一个被广泛使用的文件同步工具,它被设计为安全的,但是像所有软件一样,它的安全性取决于使用方式和它所处的环境。Unison 本身没有内置的加密功能,因此如果需要在同步过程中保护数据的安全,您应该通过 SSH 或者其他安全的通道来运行 Unison,这样可以使用 SSH 的加密功能来保护数据传输的安全。
文件冲突处理:
Unison 在遇到文件冲突时会尝试自动处理。它使用一种“更改预测”算法来决定如何合并更改。如果 Unison 无法确定如何合并文件,它会提示用户解决冲突。用户可以选择保留一个文件版本,或者手动合并更改。
资源占用:
Unison 通常不会占用大量的系统资源。它是一个相对轻量级的工具,设计用于高效地同步文件。然而,资源占用的具体情况取决于同步的文件数量、文件大小、网络速度等因素。在同步大量数据或者在网络速度较慢的情况下,Unison 的资源占用和同步速度可能会有所增加。
总的来说,Unison 是一个成熟且可靠的文件同步工具,它在处理文件冲突和资源占用方面表现出色。但是,对于安全性要求较高的应用场景,您应该采取额外的措施来确保数据的安全,例如使用加密传输、设置合适的文件权限等。

Unison 是怎么样比较两个文件不同的?基于什么算法

Unison 使用一种名为 "rsync algorithm" 的算法来比较两个文件的不同。这个算法是由 Andrew Tridgell 开发的,最初用于 rsync 工具中。Unison 的作者也参与了 rsync 的开发,因此 Unison 的同步算法与 rsync 有相似之处。
Unison 的同步算法大致如下:

  1. 块哈希
    • Unison 将文件分割成固定大小的块(默认为 1KB),并对每个块计算一个哈希值。
    • 这些哈希值用于快速比较两个文件是否相同,以及它们之间的差异。
  2. 快速比较
    • 在同步过程中,Unison 首先比较两个文件的块哈希。如果文件的块哈希完全相同,Unison 认为文件没有变化,不需要传输。
    • 如果块哈希不同,Unison 会进一步比较这些块来确定具体哪些数据需要传输。
  3. 差异传输
    • Unison 只传输文件中发生变化的部分,而不是整个文件。这大大减少了同步过程中需要传输的数据量,尤其是在网络同步时。
    • 如果文件的一小部分发生变化,只有变化的块会被传输,而不是整个文件。
  4. 安全性
    • Unison 使用加密哈希函数来计算块哈希,确保数据的完整性。在同步过程中,如果哈希值不匹配,Unison 会重新传输相应的块。
  5. 文件属性和权限
    • 除了文件内容,Unison 还同步文件的元数据,如修改时间、权限和其他属性。
      Unison 的同步算法使其成为一个高效的文件同步工具,特别是在同步大型文件或慢速网络连接时。它的增量同步机制可以显著减少同步所需的时间和带宽消耗。然而,Unison 的同步算法也有一些局限性,例如对于经常小幅度修改的大型文件,它可能不如其他同步工具高效。

使用 Unison 进行双向同步,并且忽略某些文件或文件夹(如 .DS_Store, .git, .cache 等),您可以编写一个 Unison profile 文件(例如:my-sync.prf),并在其中设置同步路径、忽略规则以及其他选项。以下是一个简化的例子:

# my-sync.prf 文件内容
root = /path/to/a
root = /path/to/b

ignore = Name .DS_Store
ignore = Name .git
ignore = Name .cache
ignore = Path */.git*
ignore = Path */.cache*

# 使用增量同步
times = true

# 双向同步,自动解决冲突(也可以根据需求更改解决策略)
auto = true
confirmbigdeletes = true # 对于大量删除操作要求确认

# 根据需要可以选择其他的同步选项,例如版本回滚等
# 更多选项请参阅Unison官方文档

# 执行同步命令时,指定profile文件
unison my-sync.prf

保存上述配置后,在终端中执行以下命令来启动同步:

unison my-sync.prf

记得将 /path/to/a/path/to/b 替换为您实际需要同步的文件夹路径。通过在配置文件中设置 ignore 项,您可以排除不想同步的文件和文件夹。同时,times 参数开启了增量同步,只同步自上次同步以来发生变化的文件。根据您的需求,还可以调整其他同步选项。

当然可以,您可以在命令行下直接传参给 unison 来实现同步,同时设置忽略规则。以下是一个在命令行中执行的例子:

unison \
  -silent \
  -times \
  -auto \
  -confirmbigdeletes \
  -ignore 'Name .DS_Store' \
  -ignore 'Name .git' \
  -ignore 'Name .cache' \
  -ignore 'Path */.git*' \
  -ignore 'Path */.cache*' \
  /path/to/a \
  /path/to/b
  • -silent 参数会让 unison 在同步时不显示欢迎信息和简单的进度报告,仅显示有问题的同步步骤。
  • -times 开启增量同步,只同步自上次同步以来文件时间戳有变化的文件。
  • -auto 表示在可能的情况下自动解决冲突,默认会询问用户。
  • -confirmbigdeletes 当有大量删除操作时要求用户确认。
  • -ignore 参数后面跟随的是要忽略的文件或目录规则。

请确保将 /path/to/a/path/to/b 替换为实际的目录路径。这样就可以在不创建配置文件的情况下完成双向同步,并忽略指定的文件和文件夹了。不过,对于长期或频繁使用的同步任务,编写配置文件会使操作更加便捷和清晰。

Unison 是一个用于文件同步和备份的命令行工具,它支持双向同步和增量同步,并且可以配置忽略特定的文件或文件夹。

要使用 Unison 进行双向增量同步并忽略 .DS_Store, .git, .cache 等文件夹,你可以按照以下步骤操作:

确保你已经安装了 Unison。如果没有,你可以从 Unison 的官方网站下载并安装。

打开终端或命令行界面,并导航到你的工作目录。

运行 Unison,使用 -ignore 参数来指定要忽略的文件或文件夹。对于多个要忽略的模式,可以用逗号分隔。Unison 使用的是 Shell 通配符模式。

以下是一个示例命令,用于同步 a 和 b 两个文件夹,并忽略 .DS_Store, .git, .cache 文件夹:

bash
unison -auto -ignore Name .DS_Store,.git,.cache -path a -path b

这个命令的解释如下:

-auto:自动解决同步冲突(需要用户干预来解决任何冲突)。
-ignore Name:告诉 Unison 使用名称匹配来忽略文件或文件夹。
.DS_Store,.git,.cache:这是你要忽略的文件或文件夹的模式列表,用逗号分隔。
-path a:指定第一个路径 a。
-path b:指定第二个路径 b。

当运行这个命令时,Unison 会显示两个文件夹之间的差异,并询问你如何解决。你可以选择接受一个文件夹中的版本,合并它们,或者跳过。

如果你想让 Unison 在后台运行并自动解决所有冲突(假设没有真正的冲突发生),你可以使用 -batch 选项代替 -auto。但是请注意,这可能会导致数据丢失,因为如果两个文件夹中有冲突的文件,Unison 会默认选择其中一个版本覆盖另一个。

bash
unison -batch -ignore Name .DS_Store,.git,.cache -path a -path b

请注意,对于重要的数据,最好是在首次同步之前手动检查 Unison 的输出,以确保它按照你的期望进行操作。

我现在按照的 unison 没包含 fsevents,怎么把 fsevents 加进来

如果您当前的 unison 版本没有包含对 fsevents 的支持,并且您不熟悉如何使用 opam 来编译软件,您可以考虑以下几种方法来获取一个支持 fseventsunison 版本:

  1. 使用 Homebrew 安装:
    Homebrew 是 macOS 上的一个包管理器,它可能提供了预编译的 unison 版本,其中包含了 fsevents 支持。您可以使用以下命令来安装 unison:
    brew install unison
    
    这通常会安装最新版本的 unison,其中包括了对 fsevents 的支持。
  2. 下载预编译的二进制文件:
    您可以查找网上是否有提供预编译的 unison 二进制文件,这些文件可能已经包含了 fsevents 支持。一些第三方网站或 unison 的镜像站点可能会提供这些文件。
  3. 使用 Docker:
    如果您熟悉 Docker,您可以考虑使用 Docker 镜像来运行 unison。有些 Docker 镜像可能已经包含了正确配置的 unison 版本,您只需要运行容器并执行同步即可。
  4. 寻求帮助:
    如果您在编译或安装方面遇到困难,您可以在相关的开发者社区或论坛上寻求帮助。提供您遇到的具体问题和错误信息,以便他人能够更准确地为您提供帮助。
    如果您决定尝试使用 opam 来编译 unison,以下是一个基本的步骤指南:
# 安装 opam,如果尚未安装
brew install opam
# 初始化 opam 环境
opam init
# 安装必要的 OCaml 包
opam install fsevents
# 获取 unison 的源代码
git clone https://github.com/bcpierce00/unison.git
# 切换到源代码目录
cd unison
# 使用 opam 环境编译 unison
./configure.sh
make

请注意,这个过程可能需要一些额外的步骤,具体取决于您的系统配置和 unison 的源代码。如果您不熟悉这些步骤,可能会遇到一些难以解决的问题。因此,使用预编译的二进制文件通常是更简单、更可靠的方法。

怎么让多个忽略参数写到一个变量里,然后传递给命令行参数

我注意到您在一条 -ignore 选项中包含了多个规则,Unison 需要为每个忽略规则单独指定 -ignore 选项。请尝试将 ignores 变量内容更改为如下形式:

ignores='-ignore Name *.DS_Store -ignore Name .cache -ignore Name aaa.txt'
unison "$main_dir" "$webdav_dir" -batch -auto -silent -repeat 5 -retry 3 $ignores

或者,如果需要保持每条规则独立且便于阅读和管理,可以这样定义变量:

ignores=(-ignore 'Name *.DS_Store' -ignore 'Name .cache' -ignore 'Name aaa.txt')
unison "$main_dir" "$webdav_dir" -batch -auto -silent -repeat 5 -retry 3 "${ignores[@]}"

这样,ignores 被定义为一个数组,然后在执行 Unison 命令时通过 "${ignores[@]}" 来引用整个数组,使得每个 -ignore 参数都能被正确识别和应用。

unison 支持 webdav 吗

是的,Unison 文件同步工具支持 WebDAV(Web Distributed Authoring and Versioning)协议。WebDAV 允许用户通过网络编辑和管理存储在远端服务器上的文件,它建立在 HTTP/HTTPS 协议之上,提供了一组扩展的命令,用于文件的创建、移动、复制和删除等操作。
要在 Unison 中使用 WebDAV,你需要指定 WebDAV 服务器的 URL 作为同步的远程端点。通常,WebDAV 服务器的 URL 格式如下:

webdav://<hostname_or_IP_address>/<path_to_repository>

或者,如果使用 HTTPS 加密:

webdav://<hostname_or_IP_address>/<path_to_repository>

在 Unison 中,你可以在命令行中指定远程 WebDAV 文件夹,或者在你的 Unison 配置文件中设置。例如,如果你使用命令行,它可能看起来像这样:

unison <local_folder> webdav://<username>:<password>@<hostname_or_IP_address>/<path_to_repository>

请确保将 <local_folder><username><password><hostname_or_IP_address><path_to_repository> 替换为实际的本地文件夹路径、用户名、密码、服务器地址和远程存储库的路径。
如果你经常使用 WebDAV 同步,可能需要将远程端的配置保存到 Unison 的配置文件中,这样可以避免每次运行 Unison 时都需要输入密码。Unison 的配置文件通常位于用户的家目录下的 .unison 文件夹中。
请注意,Unison 对 WebDAV 的支持可能依赖于 Unison 的版本和具体的 WebDAV 服务器实现。如果你遇到问题,请检查 Unison 的文档或联系你的 WebDAV 服务提供商以获取更多帮助。

unison 可以做单向同步吗

Unison 不仅可以进行双向同步,也可以进行单向同步。在 Unison 中,可以通过指定 -force-prefer 选项来实现单向同步。

例如,如果您想从目录 A 单向同步到目录 B,可以使用如下命令:

unison -force srcdir trgdir -prefer srcdir

在这里:

  • -force 表示强制执行同步,即使目标目录中有些文件比源目录中的新或不同,也覆盖目标目录的内容。
  • -prefer srcdir 表示在有冲突的情况下,优先使用 srcdir(源目录)中的文件。

不过要注意的是,单纯这样使用可能不会阻止 Unison 尝试对比并同步两个方向的所有文件。如果只需要单向复制(而非同步,即只复制源目录到目标目录,而不关心目标目录中新增或修改的内容),可以结合使用 -ignorenew 选项,忽略目标目录中新增的文件:

unison -force srcdir trgdir -prefer srcdir -ignorenew trgdir

这会告诉 Unison 忽略目标目录中所有新增的文件和目录,只将源目录的内容复制到目标目录。

当然,具体情况还需要根据实际需求来调整 Unison 的参数。

怎么做增量同步和全量同步

在 Unison 文件同步工具中,同步既可以是增量的也可以是全量的,具体取决于你的同步策略和参数设置。Unison 本身的设计是基于增量同步,即它会比较两个目录之间的差异,并仅同步那些发生变化的部分。但你也可以通过适当的设置来模拟全量同步的效果。

增量同步(默认行为):

Unison 默认执行的就是增量同步。只要之前同步过,Unison 会记住以前的状态,并只同步自上次同步以来更改过的文件。执行同步的命令很简单,例如:

unison source_directory target_directory

全量同步(模拟):

如果你想进行一次全量同步,无视过去的同步历史,可以使用 -ignorearchives 选项,这样 Unison 会重新计算所有文件的哈希值,当作首次同步一样处理:

unison -ignorearchives source_directory target_directory

请注意,全量同步会耗费更多的时间和资源,因为它会重新比较所有文件,而不是仅比较自上次同步以来改动的文件。在某些情况下,为了确保一致性,你可能需要清除 Unison 的.pstate 隐藏文件夹(包含同步历史的文件),然后进行全量同步。

在实际使用中,Unison 还提供了许多选项可以帮助你精细化控制同步行为,比如排除特定文件、按文件属性进行同步等,具体可查阅 Unison 的官方文档以了解更多信息。