我为我的个人项目使用本地 Git 存储库(无远程版本)。一切都会同步到 Google Drive,包括 Git 文件和目录。
昨天我注意到两个类从我的工作副本中消失了。我使用 Git checkout 来检索它们。今天,三个类(文件)消失了,我的 Gitgit status存储库损坏了,所以可以说那里没有存储库。我注意到 Google Drive 正在同步大约 30,000 个文件,其中大部分是从该目录中删除文件。我停下来检查我的回收站,在那里我发现了一堆 Git 文件。恢复它们返回了我的 Git 存储库,我曾经将其硬重置为 HEAD 并取回丢失的类/文件。
有没有人有过将本地 Git 存储库同步到云存储并找到解决方案的经验?我不明白为什么 Google Drive 应该决定清除我的文件,尤其是 Git 文件。
您永远不应该使用任何此类同步工具同步 git 或任何其他 dvcs 存储库。
这包括 git、mercurial、fossil、bazaar 等。
对于同步工具,这包括 Dropbox、Google Drive、OneDrive、Jottacloud 等。
为什么?
由于这些工具不将存储库视为一个单元,因此它们会逐个文件地考虑内部的各个文件。
这是一个如何轻松弄乱存储库的示例:
冲突的处理方式各不相同,但对于其中一些冲突,会创建一个带有“-conflict”文件名的额外文件。Git 或任何其他工具不会查看此冲突文件。如果两个文件都被重命名,那么您现在已经损坏了您的存储库。
这种情况可能产生的最大问题来源是在不同的计算机上进行的修改混合在一起。将创建冲突文件,但根据事情的顺序,您可能在一台计算机上更改了 4 个文件,然后在另一台计算机上更改了相同的 4 个文件,但是由于同步、排序和冲突,您最终会得到 2 个它们来自第一台计算机,另外 2 个来自另一台计算机。这些属于一起的修改的统一性已经丢失。
请注意,这里的冲突不应该出现在 git对象中,因为这些对象应该是唯一命名的(SHA1)并且只能添加,但是任何跟踪分支指针的内务文件都会很容易陷入冲突。
这种损坏可能事后修复,但它可能很困难且需要大量工作,并且很可能涉及对 Git 内部数据结构的良好工作知识。
究竟为什么你经历了你所经历的事情,以及为什么这些文件被删除,几乎无法回答。
但是,这整个事情有一个非常简单的解决方法。
停止使用 Google Drive 来同步您的存储库并注册一个免费的 bitbucket 帐户。将您的存储库推送到云中的私有项目/存储库,只需在您的计算机之间使用正常的推/拉操作即可。