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

时间:2015-04-01 20:35:36

标签: windows git powershell batch-file

我正在创建一个简单的单行批处理文件,以我首选的格式运行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 个答案:

答案 0 :(得分: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只是在打印前进行规范化,以命令它运行。

Minor nit:您可能希望重定向到commitlog.tsv,因为值由制表符分隔,而不是逗号。 : - )

Windows上的Git经常受到这类新行问题的困扰,所以请注意其他地方的问题。