同步配置注意事项
由于仓库使用.gitignore管理忽略文件, 并且.gitignore文件本身参与了同步, 会出现一种比较危险的情况:
- 你配置了
.gitignore, 使得配置文件夹如.obsidian不参与git追踪 - 当你想查看历史提交记录时, 你checkout切换了分支
- 这时, 你会惊奇地发现, 你的配置文件没有了
- 哪怕切换回main分支, 没有参与git追踪的所有文件都不会回来了.
Git 认为工作区只是 当前提交的快照副本。任何不在快照里的东西,它都会删得干干净净——除非你把该文件永久标记为“别碰我”(
skip-worktree)或在另一个独立 worktree 查看历史。
下面是GPT给出的一篇未验证正确性的方案.
o3
给所有参与者的简单提醒 —— 什么时候会丢自定义配置,以及后果是什么。
| 场景 | 会发生什么 | 后果 |
|---|---|---|
A. 直接 git checkout <旧提交>(旧提交没有你的私有配置文件) | Git 把工作区还原到旧状态 | 本地自定义配置被删掉,下一次打开 Obsidian/IDE 全部重置 |
B. 直接 git checkout <旧提交>(旧提交曾经跟踪该文件,但后来被 .gitignore) | Git 提示 _“必须先清理工作区”_强制清理后才能切换 | 配置文件被覆盖 / 删除 |
| C. 拉别人的分支并合并(对方误把配置文件加入提交) | 合并时出现冲突或自动覆盖 | 你的配置被改动,可能启动报错 |
| D. Clone 新仓库忘记拷贝模板 | 本地根本没有配置文件 | 插件和快捷键全部回到默认 |
简单规避方法
- 配置文件永不进 Git:放
.gitignore,仓库只留config.example供复制。 - 查看旧版本用
git worktree add:单独目录看历史,主目录不受影响。 - 主力开发者可给配置打
skip-worktree:git update-index --skip-worktree .obsidian/config.json
这样切任何分支都不会动到你的文件。
记住:想看历史,不要在主工作区
checkout;
真要切,先备份自己的配置。
所谓的“配置文件消失惨剧”,通常只发生在一个特定的历史遗留问题中:文件曾经被 Git 跟踪过,后来才被忽略。
假设这样一个流程:
旧提交 (Commit A):一开始你不懂,把 .obsidian 提交到了 Git 仓库里(它被跟踪了)。
新提交 (Commit B):你意识到不对,把 .obsidian 写进了 .gitignore,并执行了 git rm -r --cached .obsidian 将其从 Git 索引中剔除,然后提交。此时,你本地物理硬盘上保留着 .obsidian,且它变成了自由的 Untracked 状态。
危险操作 - 切回旧版本:当你处于 Commit B 时,执行 git checkout Commit A。
Git 发现:当前工作区有个不受管的 .obsidian,但目标 Commit A 里包含了一个受管的 .obsidian。
Git 通常会报错并中止切换,提示会覆盖未跟踪的文件(保护机制触发)。
但如果你强制切换(-f),或者通过某种方式(如 stash)绕过了保护切到了 Commit A,此时你工作区的 .obsidian 就被替换成了旧版本,并且再次被 Git 接管。
灾难发生 - 切回新版本:此时你执行 git checkout Commit B(或者 main 分支)。
Git 的逻辑链:你当前在 A(有配置文件) 切换到 B(没有配置文件)。为了让工作区匹配目标快照 B,Git 必须执行删除操作。
后果:你的 .obsidian 文件夹被 Git 物理删除了。