用 git submodule(子模块)同步多个 obsidian 库的配置文件

如果习惯用 git 管理 obsidian 的库,那么可以使用 git submodule 在多个库之间同步皮肤、插件、配置等内容。

.obsidian 仓库

.obsidian 文件夹初始化成 git 仓库

cd .obsidian
git init

在 github 创建 .obsidian 仓库。建议作为私有仓库,名字不必要是 .obsidian

将得到的 github 仓库地址填入本地 .obsidian\.git\config 中:

[remote "origin"]
	url = [email protected]:user/.obsidian.git
	fetch = +refs/heads/*:refs/remotes/origin/*

创建 .gitignore 文件,排除只和本 Vault 有关的文件:

core-plugins.json
graph.json
workspace
workspaces.json

将仓库上传到 github:

git add .
git commit -m init
git push

这里可以把分支改成 main,如果你喜欢这个新的「正确」的主分支名。

克隆子模块

把本地 .obsidian 文件夹中的 core-plugins.json、graph.json、workspace、workspaces.json 文件备份,然后删除 .obsidian 文件夹。

在库目录下执行子模块克隆命令:

git submodule add [email protected]:user/.obsidian.git .obsidian

将远程项目 [email protected]:user/.obsidian.git 克隆到本地 .obsidian 文件夹。

将备份的 4 个文件重新放回 .obsidian 文件夹中。

更新配置文件

当 A 库中的 .obsidian 中的文件变更后可以直接 commit 变更文件然后 push 到仓库。
然后在 B 库中执行更新子模块命令:

git submodule update --remote

克隆含有子模块的库

如果要在另一个设备上克隆库,子模块是不会自动克隆的。

通过查看子模块命令:

git submodule
 - e312276d6efa3de586ee64a7cb61df6ea353f363 .obsidian

子模块前面有一个 - ,说明子模块文件还未检入。

初始化子模块:

git submodule init

也可以递归克隆子模块:

git clone https://github.com/user/Vault.git Vault --recursive 
3 个赞

之前都是了解到用 AHK 以及 Quicker 的办法,想不到还有利用 Git 实现的办法,而且这个实现看起来更优雅,很棒

思考同步问题,就很自然的用 git 去想解决方案了。其实 git 有一个不好的地方,丢失文件创建时间,而创建时间在 obsidian 里作为一个排序手段很重要。

1 个赞

建议新增几个文件到 gitignore 中,关于插件的一些数据都在插件目录下,不同库可能会冲突。

daily-notes.json
plugins/obsidian-commits/data.json
plugins/obsidian-day-planner/data.json
plugins/templater-obsidian/data.json
plugins/remember-cursor-position/cursor-positions.json

清楚 git 中已经 commit 但是新增的 gitignore 文件的方法:

git rm -r --cached .
git add .

对于gitignore的论述很有帮助,甚至可以单独开一个 帖子出来。不然git会记录太多无用信息。