为什么Google Drive会删除我的Git文件?

8
我在我的个人项目中使用本地 Git 仓库(没有远程版本)。所有东西都会同步到 Google Drive,包括 Git 文件和目录。
昨天我注意到我的工作副本中有两个类消失了。我使用 Git checkout 来检索它们。今天,三个类(文件)消失了,我的 Git 仓库被损坏了,所以 git status 命令会显示那里没有仓库。我注意到 Google Drive 正在同步大约 30,000 个文件,其中大多数是从那个目录中删除的文件。我暂停了同步并检查了回收站,在那里我找到了一堆 Git 文件。恢复它们后,我使用了 Git 仓库来进行硬重置到 HEAD 并找回了丢失的类/文件。
有没有人遇到过将本地 Git 仓库同步到云存储中的经历,并找到了解决方案?我不明白为什么 Google Drive 要决定清除我的文件,尤其是 Git 文件。
2个回答

7
您永远不应该使用任何同步工具来同步git或其他dvcs存储库。这包括git、mercurial、fossil、bazaar等。
对于同步工具,这包括Dropbox、Google Drive、OneDrive、Jottacloud等。
为什么?
因为这些工具不将存储库视为一个单位,而是按文件逐个考虑其中的单个文件。
以下是您如何轻松破坏存储库的示例:
1. 在一台计算机上提交新的更改集 2. 然后移动到另一台计算机 3. 在此完全同步您的更改之前或同时进行提交或其他操作 4. 然后同步开始,在某些情况下会出现冲突
处理冲突的方式各不相同,但对于其中一些,会创建一个带有“-conflict”文件名的额外文件。 Git或其他工具不会查看此冲突文件。 如果两个文件都被重命名,则现在已损坏存储库。
这种情况可能会带来的最大问题是,在不同计算机上进行修改时会出现混合。冲突文件将被创建,但根据事情的顺序,您可能会有4个文件在一台计算机上更改,然后另外4个文件在另一台计算机上更改,但由于同步、排序和冲突,您最终会得到其中2个来自第一台计算机,另外2个来自另一台计算机。这些修改之间的统一性已经丢失了。
请注意,这里的冲突不应该出现在git对象中,因为它们应该具有唯一名称(SHA1)并且只能添加,但是任何跟踪分支指针等的清理文件都很容易进入冲突状态。
这种损坏可能在事后可以修复,但可能会很困难,需要大量工作,并且很可能涉及对Git内部数据结构的良好工作知识。
关于您遇到的问题以及为什么删除了那些文件,几乎不可能回答。
但是,这整个问题有一个非常简单的解决方法。
停止使用Google Drive来同步您的代码库,改为注册免费的Bitbucket帐户。将您的代码库推送到云端的私有项目/存储库中,然后在计算机之间使用普通的推送/拉取操作即可。

GitHub也有免费账户。(我在GitHub上用Git,因为当时Bitbucket是为Mercurial设计的...) - torek
是的,但他们没有免费带私有存储库的账户。考虑到他正在使用Google Drive进行同步,我想也许他不想公开他的代码。 - Lasse V. Karlsen
1
GitLab 提供免费的私有仓库。 - pinoyyid
1
BitBucket是我以前常用的工具。不过我曾认为使用Google Drive能够让我的生活更轻松。但实际上,我非常错误。幸好事情没有变得更糟。 - lfk
你不必使用Bitbucket - 只要你的机器可以通过ssh访问,git就可以在上面运行。例如:git clone mymachine:/Path/to/repo,然后后续的提交和拉取都可以正常工作。这不需要任何特殊的设置(你不需要一个git服务器)。这个功能已经内置在git中,非常棒。 - Pat Niemeyer
显示剩余2条评论

3
上面所选择的答案是正确的,一般情况下这是一件有风险和不正确的事情。然而,在实践中,如果我们谈论的是只有一个人在使用的“工作副本”,它在某些情况下可能是有用的。当我在桌面电脑和笔记本电脑之间反复试验时,我有时会将项目的工作副本放入Google Drive中。我仍然会将任何更改推送到“真正的”存储库中,该存储库不在Google Drive中,因此除了在冲突时浪费一点时间外,几乎没有失去任何东西。
顺便说一句 - 您可以通过ssh访问任何可通过ssh访问的计算机上的git存储库。您不需要设置git服务器或进行任何特殊设置。只需通过ssh克隆存储库,例如 git clone mymachine:/path/to/repo ,随后的推送和拉取将按预期工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接