使用git filter: clean,smudge管理思源笔记的单行json文件`.sy`,减少冲突,方便合并,同时保证性能

文章目录

    • 原理/动机
    • 缺点
    • 配置步骤
    • 脚本代码/可执行文件

原理/动机

思源笔记的单行json文件.sy,相比多行json文件,据说可提高30~50%的读写、解析效率,但是单行文件用git管理时很容易发生冲突,diff, merge效率也很低。

使用git filter的clean, smudge两个filter, 实现:

  • git add, commit到暂存区和仓库时,使用多行json存储 - filter.clean脚本控制
    • 便于git diff, merge, 减少冲突
  • git clone, pull, checkout到工作区时,使用单行json存储 - filter.smudge脚本控制
    • 保证思源笔记软件读写效率

git filter的clean, smudge原本是用来对代码中的特定字符串进行替换的(比如密码替换为*******),防止不相关人员看到,我们通过编写clean、smudge脚本,实现任何我们想实现的功能:

  • 【已实现】在转多行json的基础上,把段落中的句子、代码块中的代码语句按行存储,一句占一行,再次减少冲突

缺点

  • merge的时候如果出现冲突,手动解决冲突、提交之后,工作区中文件是按照多行存储的——这应该是git filter的bug。为了使文件变为单行存储,还需执行如下操作(删除重新检出此文件,使filter.smudge脚本强制对此文件执行一遍):
    • rm path/to/note.sy
    • git checkout -- path/to/note.sy

配置步骤

  • 首先你需要给你的filter起个名,比如sentencebreak

  • 然后在.gitattributes中指定对哪些文件应用这个filter:

    比如对所有后缀为*.sy的文件执行

    *.sy filter=sentencebreak
    
  • 然后执行git config, 配置这个filter需要执行的操作,操作可以由脚本实现:

    • 注意git config只会在本地git仓库生效,不会被push到远程,所以你其他地方的这个仓库还需要重新配置一遍
    # 比如用其他python脚本完成:
    git config filter.sentencebreak.clean "python3 ~/scripts/siyuan_git_filter/sentencebreak_clean.py"
    git config filter.sentencebreak.smudge "python3 ~/scripts/siyuan_git_filter/sentencebreak_smudge.py"
    

通过上面3步,就配置完成了。使用的时候无需特殊操作,正常使用git命令即可。

脚本代码/可执行文件

脚本源码目前可能还不完善,我先使用一段时间测试测试,后期放出。

为了提高效率,后面也可能用C++重写。

你可能感兴趣的:(git,笔记,json,思源笔记)