ICloud Drive Desktop Sync 对比 Git - 删除的文件重新出现并重复带有数字后缀

ICloud Drive Desktop Sync vs. Git - deleted files reappear and duplicates with number suffixes

关于我的设置的一些话:

我注意到以下情况时不时会发生一段时间。昨天,我将我的 MacBook Pro 备份到 MacOs Catalina 10.15.2,这似乎加剧了以下特殊性我在 git 初始化的项目文件夹中注意到了这一点:

很多时候,当我从我的 local worktree deleted files 时,它们随机开始重新出现在工作树中(有时甚至一天或更长时间),如 untracked files .

其次,我现有的文件经常突然变成 duplicated - 有一些带有数字后缀的副本,例如文件 foo 突然变成了 foo 2,文件 bar 变成了 bar 6。然后他们也会在 git status 中显示为 untracked files。 example of duplicates appearing in worktree index

我也在 .git 文件夹中观察到这种行为。 example of duplicates appearing in .git folder

* 编辑:值得注意的是,<filename> 2 重复项似乎源于以前的时间,有时甚至是一个月前(参见上面 .git 文件夹屏幕截图中的 "config 2") .我还注意到(但这在我提供的图片上没有显示)有时数字后缀是随机的,例如“6”,没有数字后缀序列(例如 1-5)导致重复的文件名与数字 6 .

我观察到这种情况时不时发生,但今天到处都是。可能是当我做了一些 git commit git resetgit 操作时,这个问题特别出现

我的假设是,这一定与 .gitICloud Drive Desktop file sync 无法正常工作有关。

所以现在我将禁用 ICloud Drive Desktop file sync 选项,看看是否能解决问题。

同时,这里有没有人熟悉我所描述的问题,谁能给我指出正确的方向,好吗?

这些帖子似乎是相关的:

Can Git and iCloud Drive be effectively used together?

https://apple.stackexchange.com/questions/255172/icloud-drive-and-git-repository/353123

Github repo cloned to synced iCloud drive on multiple computers

您不应 Git 和同步服务(例如 iCloud 和 Dropbox)一起使用。

原因是这些同步服务将单个文件视为要同步的单独的逻辑文档。当您处理文字处理文档或电子表格时,该假设是正确的。但是,对于 Git 存储库来说并非如此,它期望 POSIX 文件系统语义来确保存储库的完整性并且快速连续修改许多文件。

因为这些同步工具不能确保您的存储库状态被读取为快照(在工作树或 .git 目录中),它们可能会破坏您的存储库,并且不会作为备份或同步工具效果不佳。如果您想使用这些服务进行备份,您应该 tar 向上 .git 目录或创建一个 Git 包并将其放入要同步的位置。

简短回答:将您的存储库文件夹放在 iCloud Drive 同步文件夹之外,这样应该没问题。为了安全起见,不要将 VCS 和文件同步服务组合在一起以获得相同的 directories/files。使用 Github/GitLab/Bitbucket/etc。用于同步访问和集中保管。

长答案:iCloud Drive 是一款 "consumer" 产品,专为家庭用户设计。如果您是一名使用版本控制软件的开发人员,您将被视为 "professional" - 您会发现 iCloud Drive(以及其他文件同步解决方案)并不是适合您的版本的强大解决方案- 控制的文件夹。 iCloud Drive(和其他文件同步服务)不知道您的 VCS 设置,并且在您执行对目录进行彻底更改的操作时会感到困惑 - 例如切换分支或拉取更改。如果您想同时访问各种 computers/devices 上的存储库,并拥有 'central backup' 个存储库文件,只需使用众多存储库托管服务之一 - 例如 Github、GitLab、 Bitbucket 等

甚至更长的答案:所有 'auto-syncing' 软件都存在的关键问题是:我们如何确定文件何时更改以及何时应该同步?我们是否检查实际文件内容,假设同名文件应该是同一个文件?跟踪名称更改怎么样?当我们将文件从一台计算机传输到另一台计算机时,权限(或日期)可能会发生变化怎么办?

通常,文件同步软件会在您工作时监视目录,了解任何更改。一旦它检测到您更改了其中的某些内容,它将通过其例程来确定哪些文件已更改,并重新同步所需的文件。

有许多 VCS 操作 - 例如拉取存储库中的最新更改、切换分支或回滚到之前的提交 - 这可能会导致文件同步软件触发其同步例程。根据实际的同步算法(它如何确定已更改的内容、采取哪些步骤进行同步以及实际执行同步的速度),它很可能会检测到 'false positives',这将导致您以重复结束。

在 'iCloud Drive + git' 对的特殊情况下,我们有一个致命的组合:git 可以非常快速地对整个目录结构进行彻底的更改,而 iCloud Drive 在检测什么方面是出了名的糟糕实际上已正确更改 - 并且在同步时非常慢。这意味着当 git 开始切换分支和更新您的工作树时,iCloud Drive 可能会错误地检测到文件已更改,而实际上它们并没有。然后它将标记这些文件以进行同步。但是因为它的同步速度非常慢,当它制作第一个副本的一半时,您可能已经对您的存储库进行了另一个 git 更改 - 这将导致您现在拥有 'file 3',并且然后 'file 4' 依此类推。

希望这在未来可能会改变,但与此同时,最安全的解决方案是不要将版本控制的存储库保存在任何自动同步的文件夹中。在这种特殊情况下,如果您将存储库保存在任何非 'Documents' 或 'Desktop' 的文件夹中 - 并且未被 iCloud Drive 监视 - 那么您应该不会遇到 git 的问题。

请注意,这不仅仅是 iCloud Drive 和 git 的问题。如果您使用任何文件同步服务(Dropbox、Google Drive、OwnCloud、Box 等)和任何 VCS(git、svn、fossil 等),您可能 运行 变成某种重复、损坏或安全问题。 :(

最后,值得一提的是,iCloud Drive 和其他文件同步服务提供的好处是 'availability'(能够从多台计算机和设备访问存储库,保持同步)和'security'(有一个中心位置,其中包含所有文件的安全副本)。如果您使用任何存储库托管服务,例如 Github、GitLab、Bitbucket 等,您就已经获得了这些好处。因此,一般来说,文件同步您的存储库是您实际上不需要做的事情- 只需使用您可能已经在使用的存储库托管服务! ;-)