要将 Mac 上的项目文件夹与支持 SSH 访问的服务器上的副本进行对比,可以使用 rsync 的演练(dry-run)模式。它可以列出哪些文件看似不同步,而无需传输或更改它们。对于单个文件内的文本差异,可以在将两个版本都放到 Mac 上后使用 diff。本指南重点介绍如何对比本地项目目录与远程目录;它不假定这两个副本是同步的,也不会告诉您哪个版本应该保留。

首先检查连接和路径

在 Mac 上打开“终端”。Apple 记录了 SSH 是终端可用于连接远程服务器的协议之一;借助命令行 ssh 客户端,您还可以在远程计算机上运行命令。您需要服务器名称、远程帐户、对项目目录的访问权限以及有效的 SSH 身份验证。Apple 的终端使用手册和 OpenBSD ssh 手册介绍了这些连接选项。

请将以下示例中的帐户、主机和文件夹名称替换为您自己的名称。远程计算机必须安装有 rsync 并对您的帐户可用。rsync --version 会显示本地版本;远程版本可以通过 ssh user@host rsync --version 进行检查。

ssh user@server.example.com

如果登录失败,请在对比文件之前先解决主机、身份验证、网络或访问权限问题。然后准确认定两个项目目录。在示例中,/Users/you/Projects/site 是本地目录,/srv/projects/site 是远程目录。请在每个目录路径末尾保留斜杠,以便以相同的相对布局对比目录内容。若路径中包含空格,请用引号括起来。

预览哪些文件存在差异

在 Mac 上运行此命令:

rsync -rnic --out-format='%i %n' \
  user@server.example.com:/srv/projects/site/ \
  /Users/you/Projects/site/

远程路径是源,Mac 路径是目标。该命令使用递归(-r)、逐项更改输出(-i)、校验和对比(-c)以及演练模式(-n)。Rsync 的文档说明演练模式不会进行任何更改;逐项输出会提供一份简明的拟议更新列表。在此方向下,列出的项目意味着远程源与本地目标不同,或者在本地目标中缺失。rsync 手册介绍了演练、逐项更改和校验和对比。

校验和模式会读取两端的文件数据以对比内容,因此与 rsync 依赖文件大小和修改时间的默认快速检查相比,它可能耗时更长并占用更多磁盘 I/O。当内容至关重要(即使时间戳或大小可能并未显示出更改)时,请使用 -nic。若要进行更快速的初步排查,请改用 -rin;该选项会报告 rsync 快速检查检测到的更改,但当大小和修改时间均相同时可能会漏掉内容更改。该预览不会显示文件内部已更改的代码行。

如果应将 Mac 副本视为源,将远程副本视为目标,请颠倒这两个路径。方向至关重要:rsync 的逐项标记反映的是它将在目标位置更新的内容。在检查结果时,请保持使用 -n。只有当您明确决定执行传输时,才将其移除;rsync 是一个复制工具,而不是双向合并工具。

查看文本文件差异的内容

要检查实际的行更改,请使用 diff -u 对比两个本地文件。首先使用常规批准的传输方法将一个版本复制到单独的临时位置,或者使用本地已有的项目副本。然后运行:

diff -u \
  "/Users/you/Projects/site/config/settings.yml" \
  "/Users/you/Desktop/settings-remote.yml"

统一(unified)格式的输出会在更改的行周围放置附近的上下文。带有 - 前缀的行来自第一个文件;带有 + 前缀的行来自第二个文件。diff 是一种内容对比工具,因此它不会传输或合并编辑内容。对于整个本地目录树,diff -ru local-folder remote-folder 可以递归对比对应文件,但远程文件夹必须挂载或以其他方式作为本地路径可用。GNU Diffutils 手册解释了递归目录对比和统一输出;macOS 的命令选项可能会有所不同,因此如果某个选项被拒绝,请在 Mac 上查看 man diff。GNU Diffutils 手册。

行动前先了解局限性

干净的 rsync 预览意味着使用您选择的对比规则和路径未检测到任何差异。它并不代表并排审查、解决冲突的编辑,也不保证每个文件系统属性都完全相同。Rsync 的校验和选项对比的是文件内容,而权限和时间戳等元数据则取决于您选择的选项。此外,如果在预览后有人编辑了任一副本,文件树可能会发生变化。

如果远程系统不提供 SSH 或 rsync 访问权限,则无法按照此处所述的工作流程进行操作。请使用该系统允许的访问方法,创建两个可访问的本地副本,并使用 diff 或其他合适的对比工具进行对比。除非您确实需要由源到目标的更新行为,否则请勿运行传输命令来代替预览。

参考来源