将Git diff输出保存到文件时保留着色

201

是否可以使用某种方式将 git diff 的输出保存到文件并保留着色?

我知道如何执行 git diff > filename.rtf - 可以将结果保存到文件,但我想保留颜色。


2
您可以使用颜色将其转换为HTML:https://dev59.com/questions/wnI-5IYBdhLWcg3wHUZB - Gabe Moothart
8
如果你使用 .diff 扩展名保存文件,Notepad++ 将会对其进行高亮显示。 - Monsignor
10个回答

225

尝试:

git diff --color > foo.txt

稍后问题:
cat foo.txt

或者:

less -R foo.txt

https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration:

Git自动给大部分输出着色,但如果你不喜欢这种行为,可以使用一个总开关来关闭所有Git的彩色终端输出。要关闭所有Git的彩色终端输出,请执行以下操作: $ git config --global color.ui false 默认设置是auto,当输出直接发送到终端时会给其着色,但当输出被重定向到管道或文件时会省略颜色控制代码。 你还可以将其设置为always,忽略终端和管道之间的差异。你很少会需要这样做;在大多数情况下,如果你希望在重定向的输出中使用颜色代码,可以通过向Git命令传递--color标志来强制使用颜色代码。默认设置几乎总是你想要的。

4
@RoR,一个人的“胡言乱语”对于另一个人(嗯,终端)来说则是颜色代码。;-) 我试过了,它有效;如果我从命令行用“cat”命令读取文件,颜色会被保留。(你还能期望颜色以其他方式被保留吗?) - mpontillo
1
这就是它的作用。添加bash着色代码。如果你在控制台中cat文件,它会显示颜色。 - ralphtheninja
1
@RoR 你需要在中间添加一些内容来将 Bash 颜色代码转换为 RTF 格式。 - ralphtheninja
6
Notepad++可以突出显示diff文件。(*.diff扩展名会自动高亮,否则更改“语言--> D --> Diff”即可。) 如果您不喜欢默认颜色,可以在“设置-->样式配置器-->Diff”中更改它们。要复制带有颜色的文本,您可以使用插件(例如“NppExport”),该插件允许导出/复制为RTF或HTML格式。 - Nikita R.
5
使用命令 "git diff A B > foo.diff" 会生成一个名为 "foo.diff" 的文件,许多编辑器会以带有颜色的方式打开该文件,因为它是一个 .diff 文件。 - zeusstl
显示剩余2条评论

80

将文件保存为 .diff 扩展名,然后在 Notepad++、Vim 或 SublimeText 中打开。


git diff > 20150203_someChanges.diff

感谢 @Monsingor


谢谢。我不知道NPP有这个语法! - Danny
2
到目前为止我找到的最佳答案是它也适用于VS Code。 - Ali

23

Sublime Text 2中打开输出的差异文件。它会显示差异颜色。


1
如果diff文件的扩展名与*.diff不同,您可能需要更改语法以启用适当的突出显示。(通过“查看”->“语法”->“Diff”) - Nikita R.
1
即使在右下角自动检测到“Diff”,它也没有为我突出显示“diff.txt”。 - Nakilon

20

对 @Gabe 的回答进行补充。

您可以将输出导入到一个 ANSI 转 HTML 的 Bash 脚本中,并将该输出重定向到一个 HTML 文件中:

git diff --color|./ansi2html.sh > changes.html
当然,HTML可以被任何浏览器查看,因此输出可以在Windows等系统中阅读。
这里是ansi2html代码: http://www.pixelbeat.org/scripts/ansi2html.sh

无法工作,我得到:gawk: cmd. line:25: (FILENAME=- FNR=1) fatal: attempt to use array `a (from span)' in a scalar context。 - Tim
2
获取Homebrew并运行brew install gawk。您还需要brew install gnu-sed - Geoffrey Booth
完全符合我的要求,太棒了! - Keith
在类Debian系统中,安装kbtin并输入git diff --word-diff --color commit1 commit2 | ansi2html > changes.html - Olivier Cailloux

8

Vim的配色文件能够美观地展示git diff。

git diff


5
我在这里找到了答案:Color output of specific git command
你可以在任何git命令中传递-c color.ui=always,并且它会在重定向时仍然保持着色。例如:git -c color.ui=always status > file

3

允许从浏览器查看任何已彩色化的终端文本,例如git diff或其他文本。

sudo apt-get install aha  #  https://github.com/theZiz/aha

安装aha后,执行以下命令。
git diff --color mysourcefile  | aha > ~/cool_colorized.html

firefox  ~/cool_colorized.html

2

作为文件重定向的替代方案,您还可以使用git diff --output选项

git diff --color --output=aFile
cat aFile
# you would still see the colors

然而,请确保不要使用合并差异格式(有关合并提交的差异),例如 git diff -cgit diff --cc

从 Git 2.38(2022 年第三季度)开始,当显示组合差异时,某些差异选项(包括 --output)目前被忽略;将它们标记为与该功能不兼容。

查看 提交 cfb19ae, 提交 e3d1be4 (2022年6月18日) 由 René Scharfe (rscharfe) 提交。
(由 Junio C Hamano -- gitster -- 合并于 提交 a2d1f00, 2022年7月11日)

combine-diff: 如果给定了 --output,则中止

报告人:Ævar Arnfjörð Bjarmason
签署人:René Scharfe

目前合并差异的代码仅写入 stdout。
如果静默忽略 --output 选项,则应中止并报告该事实。
但在那时,输出文件已经被创建(为空)。

因此,错误消息将是:

combined diff and '--output' cannot be used together

1
git remote add -f b path/to/repo_b.git
git remote update
git diff master remotes/b/master > foo.txt

在SublimeText2中,提取的“*.txt”文件差异可以轻松阅读,无需设置(通过查看->语法->Diff)。

使用git remote rm remotes/b/master命令将分支重置回其原始状态。 - Abhijeet

0
你可以上传到GitHub并提供相关提交的链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接