为什么 Google Drive 会删除我的 Git 文件?
Why is Google Drive deleting my Git files?
我将本地 Git 存储库(无远程版本)用于我的个人项目。一切都同步到 Google 驱动器,包括 Git 个文件和目录。
昨天我注意到有两个 类 从我的工作副本中消失了。我使用 Git checkout 来检索它们。今天,三个 类(文件)消失了,我的 Git 存储库损坏了,所以 git status
会说那里没有存储库。我注意到 Google 云端硬盘正在同步大约 30,000 个文件,其中大部分是从该目录中删除的文件。我停下来检查我的回收站,在那里我发现了一堆 Git 文件。恢复它们返回了我的 Git 存储库,我曾经将其硬重置为 HEAD 并取回丢失的 classes/files。
有没有人有过将本地 Git 存储库同步到云存储并找到解决方案的经验?我不明白为什么 Google Drive 应该决定清除我的文件,尤其是 Git 个文件。
您应该永远不要同步git或使用任何此类同步工具的任何其他 dvcs 存储库。
这包括git、mercurial、fossil、bazaar等
同步工具包括 Dropbox、GoogleDrive、OneDrive、Jottacloud 等
为什么?
因为这些工具不将存储库视为一个单元,它们会逐个文件地考虑其中的各个文件。
下面是一个如何轻松搞乱存储库的示例:
- 在一台计算机上提交新的变更集
- 然后您转到另一台计算机
- 在这完全同步您的更改之前或期间,您开始执行提交或其他操作
- 然后开始同步,在某些情况下会发生冲突
冲突的处理方式各不相同,但对于其中一些冲突,会创建一个带有“-conflict”文件名的额外文件。 Git 或任何其他工具不会查看此冲突文件。如果这两个文件都已重命名,那么您现在已经损坏了您的存储库。
这种情况可能产生的最大问题是在不同计算机上进行的修改 混合。将创建冲突文件,但根据事物的顺序,您可能在一台计算机上更改了 4 个文件,然后在另一台计算机上更改了相同的 4 个文件,但是由于同步、排序和冲突,您最终得到 2 个它们来自第一台计算机,另外 2 个来自另一台计算机。这些属于一起的修改的 统一性 已经丢失。
请注意,此处不应在 git 对象 中出现冲突,因为这些对象应具有唯一名称 (SHA1) 且仅可添加,但任何内部管理文件跟踪分支指针,这样 很容易 陷入冲突。
这种损坏 可能 事后可以修复,但这可能很困难并且需要大量工作,并且很可能需要对 Git 内部数据结构。
您经历所经历的事情的确切原因,以及删除这些文件的原因几乎无法回答。
但是,有一个 非常简单 可以解决整个问题。
停止使用 Google 驱动器来同步您的存储库,而是 sign up for a free bitbucket account。将您的存储库推送到云中的私有 project/repository,然后只需在您的计算机之间使用正常的 push/pull 操作。
上面选择的答案是正确的,因为它通常是冒险且不正确的事情。但是,在实践中,如果我们谈论的是只有一个人使用的 工作副本 ,它在某些情况下可能会有用。当我在台式机和笔记本电脑之间来回切换并进行大量试验时,有时我会将项目的工作副本放入 google 驱动器。我仍然最终将任何更改推送到 real 存储库,它不在 google 驱动器中,所以如果我有冲突,我还没有发生过。
顺便说一下 - 您可以在任何可以通过 ssh 访问的机器上访问 git 存储库。您 不必 设置 git 服务器或进行任何特殊设置。只需通过 ssh 克隆 repo,例如git clone mymachine:/path/to/repo
并且后续的推送和拉取将按预期工作。
我将本地 Git 存储库(无远程版本)用于我的个人项目。一切都同步到 Google 驱动器,包括 Git 个文件和目录。
昨天我注意到有两个 类 从我的工作副本中消失了。我使用 Git checkout 来检索它们。今天,三个 类(文件)消失了,我的 Git 存储库损坏了,所以 git status
会说那里没有存储库。我注意到 Google 云端硬盘正在同步大约 30,000 个文件,其中大部分是从该目录中删除的文件。我停下来检查我的回收站,在那里我发现了一堆 Git 文件。恢复它们返回了我的 Git 存储库,我曾经将其硬重置为 HEAD 并取回丢失的 classes/files。
有没有人有过将本地 Git 存储库同步到云存储并找到解决方案的经验?我不明白为什么 Google Drive 应该决定清除我的文件,尤其是 Git 个文件。
您应该永远不要同步git或使用任何此类同步工具的任何其他 dvcs 存储库。
这包括git、mercurial、fossil、bazaar等
同步工具包括 Dropbox、GoogleDrive、OneDrive、Jottacloud 等
为什么?
因为这些工具不将存储库视为一个单元,它们会逐个文件地考虑其中的各个文件。
下面是一个如何轻松搞乱存储库的示例:
- 在一台计算机上提交新的变更集
- 然后您转到另一台计算机
- 在这完全同步您的更改之前或期间,您开始执行提交或其他操作
- 然后开始同步,在某些情况下会发生冲突
冲突的处理方式各不相同,但对于其中一些冲突,会创建一个带有“-conflict”文件名的额外文件。 Git 或任何其他工具不会查看此冲突文件。如果这两个文件都已重命名,那么您现在已经损坏了您的存储库。
这种情况可能产生的最大问题是在不同计算机上进行的修改 混合。将创建冲突文件,但根据事物的顺序,您可能在一台计算机上更改了 4 个文件,然后在另一台计算机上更改了相同的 4 个文件,但是由于同步、排序和冲突,您最终得到 2 个它们来自第一台计算机,另外 2 个来自另一台计算机。这些属于一起的修改的 统一性 已经丢失。
请注意,此处不应在 git 对象 中出现冲突,因为这些对象应具有唯一名称 (SHA1) 且仅可添加,但任何内部管理文件跟踪分支指针,这样 很容易 陷入冲突。
这种损坏 可能 事后可以修复,但这可能很困难并且需要大量工作,并且很可能需要对 Git 内部数据结构。
您经历所经历的事情的确切原因,以及删除这些文件的原因几乎无法回答。
但是,有一个 非常简单 可以解决整个问题。
停止使用 Google 驱动器来同步您的存储库,而是 sign up for a free bitbucket account。将您的存储库推送到云中的私有 project/repository,然后只需在您的计算机之间使用正常的 push/pull 操作。
上面选择的答案是正确的,因为它通常是冒险且不正确的事情。但是,在实践中,如果我们谈论的是只有一个人使用的 工作副本 ,它在某些情况下可能会有用。当我在台式机和笔记本电脑之间来回切换并进行大量试验时,有时我会将项目的工作副本放入 google 驱动器。我仍然最终将任何更改推送到 real 存储库,它不在 google 驱动器中,所以如果我有冲突,我还没有发生过。
顺便说一下 - 您可以在任何可以通过 ssh 访问的机器上访问 git 存储库。您 不必 设置 git 服务器或进行任何特殊设置。只需通过 ssh 克隆 repo,例如git clone mymachine:/path/to/repo
并且后续的推送和拉取将按预期工作。