git 对 Microsoft Word 进行版本控制
昨天中国高校发生了一件骇人听闻的事情,听说不少高校的校园网用户连接校园网被勒索病毒给黑了,重要文件全部被加密,必须要支付赎金才能解密,具体新闻可以参见:http://www.sohu.com/a/140236495_346360。而且还有不少是和我一样的大四毕业狗,听说因为毕业论文没有备份,结果被黑了,然后,然后就没有然后了。。。真的是欲哭无泪啊。看到这个消息,我想起来我的没写完的毕业论文好像也没备份,吓得我赶紧去把论文备份到onedrive上面去了。据说微软之前已经打过补丁了,只是我国广大使用盗版windows的用户(包括我~-~)相当一部分都没有自动更新打补丁的习惯,像我之前就特别讨厌windows的自动更新,感觉浪费时间,现在才知道那真的不是没有用啊!还好win10是强制自动更新的。看来以后我得养成经常备份重要文件的习惯了,不然哪天电脑也被黑了,文件丢了,真的是欲哭无泪了。
说到文件备份,我们一般想到的当然就是什么云盘之类的啦,比如百度云,腾讯的微云之类的,当然对于office 文档而言,onedrive
本身就是一个很棒的备份工具。但是这些操作都有些太麻烦了,而且如果文件需要频繁的修改,就得不停地上传,下载,实在是太麻烦了。要是有一个能方便控制版本的工具就好了。说到版本控制,写代码的都知道有大名鼎鼎的git啊!诶,对了,能不能用git 对 word文档进行版本控制呢?我突然想到这里,就用google 搜了一下,发现还真的可以。下面我就给大家介绍怎么做。
http://blog.martinfenner.org/2014/08/25/using-microsoft-word-with-git/ 这篇文章对用git 进行word版本控制讲的比较清楚,但是有些细节遗漏了。于是我又去github上面找了一个:https://github.com/vigente/gerardus/wiki/Integrate-git-diffs-with-word-docx-files 这里就讲的非常清楚了。
首先,简单介绍一下git。维基百科上是这么介绍git的:
git(/ɡɪt/[5], 音频(帮助·信息))是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。应注意的是,这与GNU Interactive Tools[6](一个类似Norton Commander界面的文件管理器)有所不同。
git最初的开发动力来自于BitKeeper和Monotone[7][8]。git最初只是作为一个可以被其他前端(比如Cogito或Stgit[9])包装的后端而开发的,但后来git内核已经成熟到可以独立地用作版本控制[10]。很多著名的软件都使用git进行版本控制[11],其中包括Linux内核、X.Org服务器和OLPC内核等项目的开发流程[12]。
简单来说就是一个分布式版本控制系统,著名的github网站就是建立在git的基础上的。如果你还不会使用git,请去google 相应的教程(其实官网文档就挺好),简单上手使用估计半个小时就可以了。
git 一般只能对纯文本文件进行版本控制,但是如果有其他中间转化软件的协助,就可以对任意二进制文件进行版本控制了。word 的.doc 或者 .docx 就不是一个纯文本文件,所以需要第三方转化工具,将其转化为 纯文本。这里的工具就是 pandoc。pandoc is
a universal document converter。即是一个通用的文档转换器。
If you need to convert files from one markup format into another, pandoc is your swiss-army knife. Pandoc can convert documents in markdown, reStructuredText, textile, HTML, DocBook, LaTeX, MediaWiki markup, TWiki markup, OPML, Emacs Org-Mode, Txt2Tags, Microsoft Word docx, LibreOffice ODT, EPUB, or Haddock markup to
- HTML formats: XHTML, HTML5, and HTML slide shows using Slidy, reveal.js, Slideous, S5, or DZSlides.
- Word processor formats: Microsoft Word docx, OpenOffice/LibreOffice ODT, OpenDocument XML
- Ebooks: EPUB version 2 or 3, FictionBook2
- Documentation formats: DocBook, TEI Simple, GNU TexInfo, Groff man pages, Haddock markup
- Page layout formats: InDesign ICML
- Outline formats: OPML
- TeX formats: LaTeX, ConTeXt, LaTeX Beamer slides
- PDF via LaTeX
- Lightweight markup formats: Markdown (including CommonMark), reStructuredText, AsciiDoc, MediaWiki markup, DokuWiki markup, Emacs Org-Mode, Textile
- Custom formats: custom writers can be written in lua.
看到上面这么多眼花缭乱的格式,就知道 pandoc有多牛逼了。当然我们这里只需要将其转化为markdown 格式。下面开始说 git 对word 进行版本控制的 步骤:
1. Install pandoc. 去http://pandoc.org/installing.html 找到合适的pandoc下载文件,然后下载安装。
2. install git
3. 如果是在 unix(linux/macosx)系统下,编辑 ~/.gitconfig 文件,如果是在windows系统下,编辑 git 安装目录下的 /mingw64/etc/gitconfig 文件,加上这么一段话:
[diff "pandoc"] textconv=pandoc --to=markdown prompt = false [alias] wdiff = diff --word-diff=color --unified=1
然后在你的工程目录下新建一个 .gitattributes(linux/mac)文件(windows是gitattributes 文件),然后写入:
*.docx diff=pandoc
当然上面的是docx文件,如果是doc文件,把docx换成doc应该也是一样的。
然后 在工程目录下初始化git(git init)
git add . 即把所有的文件都添加进去(包括.gitattributes文件)
其他的 git commit -m git remote add origin git push origin master 等都是一样的。
现在如果想要看本次修改之后与上次commit 之间的差别,可以使用命令(file.docx是你的word文件名):
git wdiff file.docx
这个命令会将本次修改的与上次不同的地方用彩色标识出来。
如果想查看 历次的改变(all changes),可以使用命令:
git log -p --word-diff=color file.docx
4. 使用pandoc。对于你想要git 控制版本的文档file.docx 在命令行(windows)或者unix下的shell,输入命令:
pandoc -s file.docx -t markdown -o file.md
这个命令将你的.docx 文档转化为 .md markdown 格式。然后再 git add file.docx file.md (或者 git add .),git commit即可。
还是看我自己的一个实际的小例子吧。我在project 目录下有 一个名为 How_to_live_your_college_life.docx 的文档,在使用pandoc 转化为markdown之后,我 一次push,commit
然后我把标题改了一下,保存。在git bash 下,输入:git wdiff How_to_live_your_college_life.docx 得到结果如下图1所示:
图1
图1中绿色红笔圈出来的部分就是我上一次修改的内容。
再执行git log -p --word-diff=color How_to_live_your_college_life.docx 命令,就会把历次修改的部分用绿色标注出来,如图2所示(部分):
图2
哈哈,就是这么简单,几行命令就搞定啦。大家快过来试试吧!