多个仓库之间的设置如何同步?

在一个仓库里设置好了主题、快捷键那些,但是去到其他的仓库又得重新设置一遍,其他什么方法可以复制或者同步吗?

把 .obsidian 目录复制过去就行了,快捷键、主题、插件这些都在 .obsidian 目录下

1 个赞

好的,谢谢! :+1: :+1: :+1:

软链接也行:利用DOS命令(subst或mklink)实现Obsidian多库统一配置

1 个赞

手动同步

Obsidian中的配置插件样式等,都是保存在.obnsidian文件夹下的,我们只需要让这个文件夹之间同步就能解决上述的问题了。你可以每次修改配置后,手动复制.obsidian 文件。

自动同步

建立一个专门存放Obsidian配置的文件夹(我将它称为中心配置文件),你也可以使用已有的配置文件作为中心配置。
接着使用软连接进行关联,命令示例:

mklink /J "E:\Obsidian Vault\开发知识库\.obsidian" "E:\Obsidian Vault\.obsidian"
mklink /J "E:\Obsidian Vault\TestConfig\.obsidian" "E:\Obsidian Vault\.obsidian"

一键自动配置

我编写了一个脚本,可以一键自动进行软连接,需要你自己调整一下配置。

import os
import shutil
import subprocess
import sys
from ctypes import windll

# ------------------- 用户配置区域 -------------------
SYNC_VAULTS = ["待办与备忘", "感悟与心得", "开发知识库"]
EXCLUDE_FILES = ["workspace.json", "workspaces.json"]
CONFIG_CENTER = ".obsidian"


# ---------------------------------------------------

def require_admin():
    """自动请求并获取管理员权限"""
    if os.name == 'nt':
        try:
            # 首次检测权限
            if windll.shell32.IsUserAnAdmin() == 0:
                print("🔒 正在请求管理员权限...")
                # 生成提权后的新进程
                windll.shell32.ShellExecuteW(
                    None,  # 无父窗口
                    "runas",  # 请求提升权限
                    sys.executable,  # Python解释器路径
                    f'"{sys.argv[0]}"',  # 当前脚本路径(带引号处理空格)
                    None,  # 工作目录保持默认
                    1  # 显示窗口
                )
                # 终止原始非特权进程
                sys.exit()
        except Exception as e:
            print(f"❌ 权限请求失败: {str(e)}")
            sys.exit(1)


def sync_config():
    base_dir = os.getcwd()
    config_center = os.path.join(base_dir, CONFIG_CENTER)

    # 验证中心配置目录
    if not os.path.exists(config_center):
        print(f"❌ 错误:中心配置目录 {CONFIG_CENTER} 不存在")
        return False

    for vault in SYNC_VAULTS:
        vault_path = os.path.join(base_dir, vault)
        target_dir = os.path.join(vault_path, ".obsidian")

        # 跳过不存在的仓库
        if not os.path.exists(vault_path):
            print(f"⏩ 跳过不存在的仓库:{vault}")
            continue

        try:
            # 清理旧配置
            if os.path.exists(target_dir):
                if os.path.islink(target_dir) or os.path.isfile(target_dir):
                    os.remove(target_dir)
                else:
                    shutil.rmtree(target_dir)
                print(f"🗑️ 已清除旧配置:{vault}")

            # 创建新目录结构
            os.makedirs(target_dir, exist_ok=True)

            # 创建符号链接
            for item in os.listdir(config_center):
                if item in EXCLUDE_FILES:
                    continue

                src_path = os.path.join(config_center, item)
                dest_path = os.path.join(target_dir, item)

                link_cmd = f'mklink /D "{dest_path}" "{src_path}"' if os.path.isdir(
                    src_path) else f'mklink "{dest_path}" "{src_path}"'

                # 执行系统命令
                subprocess.run(link_cmd, shell=True, check=True)
                print(f"🔗 已创建链接:{vault}/{item}")

        except Exception as e:
            print(f"❌ 处理仓库 {vault} 失败:{str(e)}")
            continue

    return True


if __name__ == "__main__":
    require_admin()

    print("=" * 50)
    print("Obsidian 配置同步工具".center(50))
    print("=" * 50)

    try:
        if sync_config():
            print("✅ 同步操作成功完成")
        else:
            print("⚠️ 同步操作未完全完成")
    except Exception as e:
        print(f"‼️ 发生未捕获的异常:{str(e)}")

    # 保持窗口打开
    if sys.platform == "win32":
        os.system("pause")