git diff word文件

前言

写论文时,常做文件的变更,有时候修改时容易手误修改到其他正常的地方。

为了解决以上问题,考虑将Word文件放到Git上进行版本管理,方便追溯与版本对比。

但存在一个问题为,git不支持直接对Word文件进行diff,所以考虑自定义git diff工具,该工具能直接调用word的对比工具,方便查看文件的修改。

开始行动

新建处理脚本

该脚本的主要作用为,调用word接口,创建一个比较文件出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
' Word文档比较工具
' 用法: cscript compare.vbs 原文档.doc 新文档.doc

' 1. 检查参数数量
If WScript.Arguments.Count <> 2 Then
WScript.Echo "Usage: cscript compare.vbs file1.doc file2.doc"
WScript.Echo "example: cscript compare.vbs a.doc b.doc"
WScript.Quit
End If

WScript.Echo "VBScript run,param1: " & WScript.Arguments(0)
WScript.Echo "VBScript run,param2: " & WScript.Arguments(1)

' 2. 获取文件路径
file1 = WScript.Arguments(0)
file2 = WScript.Arguments(1)

' 3. 创建Word应用程序对象
On Error Resume Next
Set wordApp = CreateObject("Word.Application")
If Err.Number <> 0 Then
WScript.Echo "error: can't create Word app object"
WScript.Echo "make sure already installed Microsoft Word"
WScript.Quit
End If
On Error GoTo 0

wordApp.Visible = True ' 确保Word可见

' 4. 打开两个文档
On Error Resume Next
Set doc1 = wordApp.Documents.Open(file1)
If Err.Number <> 0 Then
WScript.Echo "error: can't open file " & file1
wordApp.Quit
WScript.Quit
End If

Set doc2 = wordApp.Documents.Open(file2)
If Err.Number <> 0 Then
WScript.Echo "error: can't open file " & file2
doc1.Close False
wordApp.Quit
WScript.Quit
End If
On Error GoTo 0

' 5. 比较文档(开启所有比较选项)
' 参数说明:
' doc1 - 原文档对象
' doc2 - 修订文档对象
' 2 - wdCompareTargetNew (比较目标设为新文档)
' 0 - wdGranularityWordLevel
' 后面8个True对应所有比较选项
wordApp.CompareDocuments doc1, doc2, 2, 0, True, True, True, True, True, True, True, True

' 6. 比较完成后关闭原文档和修订文档
On Error Resume Next
doc1.Close False
doc2.Close False
On Error GoTo 0

' 7. 清理资源
Set doc1 = Nothing
Set doc2 = Nothing
Set wordApp = Nothing

WScript.Echo "compare done."

当然这个脚本也可以直接使用,可以不配置到git中,配置到git中主要是为了比较工作区和暂存区的word文件

使用方法:cscript compare.vbs 源文件 修改后的文件(文件需要带上完整的路径)

举例:

1
cscript compare.vbs "C:\Users\fywfeng\Desktop\bachelor-degree\a.doc" "C:\Users\fywfeng\Desktop\bachelor-degree\b.doc"

配置git

直接在用户目录修改git的全局配置

一般路径位置:C:\Users\用户名

文件名:.gitconfig

新增内容

1
2
3
4
[difftool "worddiff"]
cmd = "cscript \"E:\\SelfFiles\\bachelor-degree\\compare.vbs\" \"$LOCAL\" \"$PWD/$MERGED\""
[diff]
tool = worddiff

这里的脚本路径换成自己的脚本路径,尽量不要包含中文

为了后续方便使用可以使用alias简化命令,继续在.gitconfig中新增

1
2
[alias]
diffword = difftool --tool=worddiff --no-prompt

当然这里也可以选择使用git命令来加,需要注意路径需要加转义,这里就不过多赘述了。

试一试

执行指令

1
git difftool --tool=worddiff --no-prompt 文件名

或者使用alias的命令

1
git diffword 文件名

如果目标文件存在工作区与暂存区的变更,则会弹出对比文件,如果不存在变更则不会弹出

举个栗子

1
2
3
4
5
6
7
E:\SelfFiles\flod>git diffword dir\task.doc
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

VBScript run,param1: C:\Users\fywfeng\AppData\Local\Temp/git-blob-a27680/task.doc
VBScript run,param2: E:/SelfFiles/flod/dir/task.doc
compare done.

结语

仍有很多可以改进的地方,后续有用到的地方再更新迭代