Git 做代码笔记,利用钩子自动生成所有目录下的 MD 文件索引
偶然有一天,我想利用Markdown格式的文件来做代码笔记本,试用了多款软件,发现VNote这款软件还不错,下载地址: https://github.com/tamlok/vnote/releases/tag/v2.8.2
我结合了目录文件方法,还有VNote软件的使用,达到了自己想要用Markdown写代码笔记的目的,目录文件利用Git钩子生成所有文件的索引,可以方便在GitHub上查看,而VNote则作为md文件的编辑器及本地客户端使用。
我的 Git 代码笔记的目录结构:
- git 项目根目录
- HTML
- xxx.md
- yyy.md
- CSS
- Git
- 前端
- VUE
- README.md
- HTML
大概就类似这样,支持多级目录,目录下就是 md 文件,我的想法是,通过钩子自动提取这些文件的文件名并自动生成一个目录索引,就像下面这样:
我的代码笔记
Composer
Express
Git
NPM
PHP
VUE
我要的最终效果就是上面这样的,然后我用它替换 README.tpl.md 里面的一个特殊字符串,生成README.md,最后在自动提交推送到 GitHub 上,于是所有的 md 就有索引了,一个简单的 md 代码笔记本就完成了!
我的系统是 Windows,而且也安装了 NodeJs,所以 Git 的钩子就用 Node 写了,钩子文件名是 pre-commit ,需要放在项目目录下 .git\hooks 文件夹下,使用了VNote,需要过滤一些文件,定义在钩子文件里,钩子文件完整代码如下:
#!/usr/bin/env node
const execSync = require('child_process').execSync
const fs = require('fs')
const path = require('path')
const urlPrefix = 'https://github.com/qq940390/CodeNote/blob/master/'
const projectPath = path.join(__dirname, '../../')
//要忽略的文件夹或文件
const ignoreItem = ['.git', '_v_recycle_bin', '_vnote.json']
//要忽略的文件后缀
const ignoreExt = ['json']
//获取所有目录和子目录下的文件,如果需要判断文件格式,需要另外修改
function getAllFiles (_path) {
let files = []
let level = 1
function findFile (_path) {
let paths = fs.readdirSync(_path)
paths.forEach(function (item, index) {
//排除文件夹和文件
if (ignoreItem.indexOf(item) !== -1 || ignoreExt.indexOf(item.substr(item.lastIndexOf('.') + 1)) !== -1) return;
let fPath = path.join(_path, item)
let stat = fs.statSync(fPath)
if (stat.isDirectory() === true) {
level += 1
findFile(fPath)
level -= 1
}
if (stat.isFile() === true && level > 1) {
fPath = fPath.replace(projectPath, '').replace('\\', '/')
let pathPrefix = fPath.replace(item, '')
files.push([pathPrefix, fPath.replace(pathPrefix, '')])
}
})
}
findFile(_path)
return files
}
//将文件名改变为 md 中的 url 格式内容
var dirFiles = getAllFiles(projectPath)
var data = []
dirFiles.forEach(function (item, index) {
let url = urlPrefix + encodeURI(item[0] + item[1])
if (!data[item[0]]) data[item[0]] = []
data[item[0]].push('[' + item[1] + '](' + url + ')')
})
//按照一定格式制定内容
var fileData = []
for (let index in data) {
let str = []
str.push('## ' + index.substr(0, index.length - 1) + '\n')
data[index].forEach(function (item) {
str.push('* ' + item)
})
fileData.push(str.join('\n') + '\n')
}
//读取 README.md 的模板文件 README.tpl.md
var tplData = fs.readFileSync(projectPath + '/README.tpl.md').toString()
//替换变量标签 {{replacement}} 为正式内容
tplData = tplData.replace('{{replacement}}', fileData.join('\n'))
//覆盖 README.md 文件
fs.writeFileSync(projectPath + '/README.md', tplData)
//将变更的文件列入待提交内容里
execSync(`git add README.md`)
//正确退出,输出非0值表示拒绝提交
process.exit(0)
README.tpl.md 文件的内容:
# 我的代码笔记
{{replacement}}
代码粗糙别介意,能实现功能就行。其中 README.tpl.md 和 README.md 文件同级目录。
钩子文件里的 urlPrefix 可以自行将 https://github.com/qq940390/CodeNote 替换为自己项目的地址。
最后,还要将 *.vswp 类型加入 .gitignore 文件里忽略掉,这是VNote编辑md文件时的临时文件。
最终生成的 md 列表格式,也是可以修改的,在 pre-commit 文件里修改,最终的 README.md 的上面部分的内容可以在模板里根据自己需要修改。同理,大家也可以发挥更多的想象,实现更多的想法。
如果大家觉得有用,就点个赞吧~
本文介绍如何使用Git钩子和VNote软件自动生成Markdown格式代码笔记的目录索引,实现高效管理个人代码知识库。

被折叠的 条评论
为什么被折叠?



