Git命令行和批处理文件输出不同

4

我正在创建一个简单的批处理文件,以我的首选格式运行git日志。当我在PowerShell中时,我会输入:

git log --pretty=format:"%ai%x09%H%x09%s" > commitlog.csv

它给了我我想要的输出。它是提交作者的日期和时间以ISO格式,后跟制表符,接着是完整的SHA哈希,再跟着注释/描述。它在Excel中以我想要的方式打开。

我试图制作一个简单的批处理文件来完成完全相同的事情,这样我就不必记住格式字符串或搜索命令历史记录(它偶尔也会被清除)。我注意到我必须使用双百分号%%来替换所有百分号。

在批处理文件的一个版本中,我有这样一行:

git log --pretty=format:"%%ai%%x09%%H%%x09%%s" > commitlog.csv

我注意到这个命令的回显如下:

git log --pretty=format:"%ai%x09%H%x09%s"  1>commitlog.csv

这段内容似乎有一个“1”插入其中,但奇怪的是它创建了一个包含信息的文件,只是将制表符排除在外,所以所有内容都连在一起。我读到大于号">"需要前面加上脱字符号"^>"。

因此,在下一个批处理文件版本中,我将该行更改为:

git log --pretty=format:"%%ai%%x09%%H%%x09%%s" ^> commitlog.csv

这将像这样回显该命令:

git log --pretty=format:"%ai%x09%H%x09%s" > commitlog.csv

我已经长时间地、多次地盯着它看了,它似乎与我在PowerShell中输入的内容完全相同,我期望得到相同的结果,但是却收到了错误消息:

fatal: ambiguous argument '>': unknown revision or path not in the
working tree.

Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

我哪里做错了吗?

1个回答

3

git log --pretty=format:命令在每行的末尾只使用换行符(0x0A)来终止。Windows上的大多数工具(如记事本)都希望每行以回车符(0x0D) 换行符结尾。但是,cmd对仅有换行符的特殊处理使控制台输出看起来很漂亮。

因此,批处理文件应该类似于以下内容:

git log --pretty=format:"%%ai%%x09%%H%%x09%%s%%x0D" > commitlog.csv

请注意要手动添加回车符的额外%%x0D。正如您已经发现的那样,在批处理脚本中需要使用%%来转义单个%
在这里,1>>基本上是等效的。1只是stdout的数字值(与stderr的2进行比较),但默认情况下重定向stdout。Cmd在运行命令之前进行标准化。
小细节:您可能希望重定向到commitlog.tsv,因为值是由制表符而不是逗号分隔的。 :-)
Windows上的Git常常受到这些换行符问题的困扰,所以请在其他地方留意它们。

我的Windows程序没有换行符的问题,每一行都在它应该在的位置上。我尝试了你的建议,但是添加%%x0D并没有对我的输出产生影响。出于某种奇怪的原因,当我运行批处理文件时,它实际上没有添加制表符(%%x09),每行数据都连在一起。 - Trashman
而且 Excel 不认识 .tsv 文件类型,所以我不使用它。无论实际使用的分隔符是什么,它都可以解析 csv 文件。 - Trashman

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