git: 用post-commit hook来探测Org-mode中的大量被删除的行
可能你也遇到过相同的问题: 当大型 Org-mode 层级架构被折叠时, 你可能会无意中覆盖或删除 Org-mode 文件中的大量内容.
若你切好用 git 仓库来管理 Org-mode 文件,那这没有什么大不了的. 我甚至使用 gitwatch 来自动提交 Org-mode 文件的所有更改. 任何Org-mode文件中的更改都可以被回撤. 只不过, 你需要 认出 被删掉的这些行以便能够恢复之.
下面这个技巧可以帮到你: 使用下面这个 post-commit hook , 当你签入一个超过一定行数的提交时就会在日常agenda中产生一个警告.
你需要修改下面的代码才能使之工作. 请将内容中的 OUTFILE
修改为你 org-agenda-files
中的某个文件. 任何该脚本产生的警告信息会添加到该文件中.
警告信息报告当前(提交)的时间戳, 你不可能会遗漏这条信息: 它放在你的日常agenda中.
你也可能需要修改 THRESHOLD
的值. 该值的意思是单个文件在不产生任何警告的情况下最多能删除多少行.
#!/bin/sh # # An example hook script that is called after a successful # commit is made. # # To enable this hook, rename this file to "post-commit". ## current/last commit: CURRENT_HASH=`git rev-parse HEAD` ## the commit before: PREVIOUS_HASH=`git rev-parse HEAD^1` ## the file where the message(s) are being written to: OUTFILE="${HOME}/org/errors_orgmode_commits.org" ## number of lines that are OK to be deleted in one single file: THRESHOLD=250 MESSAGE="** commit ${CURRENT_HASH} deleted more than ${THRESHOLD} lines in a file!" DETAILS="#+BEGIN_SRC sh :results output cd ${HOME}/org echo \"commit ${CURRENT_HASH}\" git diff --stat \"${PREVIOUS_HASH}\" \"${CURRENT_HASH}\" #+END_SRC" ## manual test with: ## git diff --stat `git rev-parse HEAD^1` `git rev-parse HEAD` git diff --numstat "${PREVIOUS_HASH}" "${CURRENT_HASH}" | \ cut -f 2 | \ while read line do test "$line" -gt "${THRESHOLD}" && \ echo "${MESSAGE}\n<`date '+%Y-%m-%d %H:%M'` +1d>\n\n${DETAILS}\n" >> \ "${OUTFILE}"; \ done #end
这样当你在agenda中发现一个警告时, 点击它,甚至可以在标题下的babel代码片段上按下 C-c C-c
进行执行. 它会告诉你提交的详细信息.
解决问题之后,只需手动删除error-Org-mode文件中已解决错误的标题就行了。