All posts
BLOG & NOTES

Git 仓库与百度网盘同步冲突排查

1 问题背景

我把个人归档目录放进百度网盘同步空间,希望在多台设备之间保持文件一致,同时继续使用 Git 管理其中的仓库。

这种组合乍看没有问题:网盘负责文件同步,Git 负责版本管理。但两套机制都可能在后台修改同一个目录,尤其是 .git 内部的引用文件。它们并不了解彼此的操作时序,因此不适合无约束地同时读写。

2 遇到的错误

2026 年 10 月 12 日,我在仓库中执行:

git pull --tags origin main

Git 返回:

fatal: bad object refs/heads/main.baiduyun.uploading.cfg
error: https://github.com/FuTseYi/Personal_Folders.git did not send all necessary objects

其中值得注意的是:

refs/heads/main.baiduyun.uploading.cfg

这个文件名带有百度网盘同步过程中的临时标记。问题并不是普通的远端分支冲突,而是 Git 读取本地引用时,遇到了同步客户端正在处理的文件。

3 原因与处理

Git 的 .git 目录保存提交对象、引用和索引等内部数据。网盘同步工具看到的只是普通文件,并不知道 Git 可能正在更新引用、写入对象或重建索引。

如果同步客户端恰好在 Git 操作期间处理这些文件,就可能出现短暂的临时文件、引用状态不一致,甚至对象缺失等异常。

这次我采用的处理方式很简单:

  1. 暂停或退出百度网盘同步客户端,避免它继续处理仓库目录
  2. 等待 Git 操作和文件写入完全停止
  3. 重新启动同步客户端,让它完成当前同步状态的整理
  4. 再次执行 Git 操作,确认仓库恢复正常

当时关闭同步后重新同步,问题便不再出现。这个结果说明冲突与同步时序有关,但不应据此认定所有类似错误都由网盘造成。

4 更稳妥的目录管理方式

对于同时使用 Git 和网盘的个人归档,我更倾向于把两者的职责分开:

  • Git 仓库:负责代码版本、提交历史、分支和远端协作
  • 网盘同步空间:负责普通文件在设备之间的同步
  • 独立备份:负责保存可恢复的历史副本

如果确实需要把仓库放在同步空间中,尽量避免多个设备同时操作同一个仓库,也不要让同步客户端在 Git 正在执行 pull、checkout、rebase 或 commit 时改写 .git。

更稳妥的做法,是把正在开发的仓库放在本地普通目录,完成提交和推送后,再将需要归档的文件或仓库快照复制到网盘。若需要完整 Git 历史,可以使用 Git bundle 或镜像方式保存,而不只是下载源码 ZIP。

5 验证与日常检查

遇到类似问题时,可以先检查仓库状态:

git status
git branch -avv
git fsck --full

其中 git fsck --full 可以帮助检查对象数据库的一致性。执行修复或清理前,建议先保留当前目录副本,不要直接删除不认识的 .git 文件。

如果问题只在网盘同步期间出现,先暂停同步、确认 Git 状态,再恢复同步,比反复执行 pull 或 reset 更稳妥。

6 总结

这次排查让我更明确了一点:同步不等于版本控制,版本控制也不等于备份。

Git 需要对仓库内部状态进行有序、原子的更新,而普通网盘同步工具并不具备 Git 感知能力。把两者放在同一目录时,关键不是简单地让它们同时工作,而是明确操作边界和先后顺序。

对需要长期维护的个人归档来说,让 Git 管理版本、让网盘管理普通文件同步,再单独保留可恢复的备份,会更容易维护。