我在 Windows 上的 git bash 中使用以下 git 命令:
git log --format="%C(cyan)%cd%Creset %s" --date=short -5
它显示提交日期 ( %cd
),后跟提交消息 ( %s
)。提交日期用颜色标记包裹:%C(cyan)
开始彩色输出和%Creset
停止彩色输出。
虽然它在 git bash 中运行良好,但在cmd
:%cd%
被 Windows shell 扩展为当前工作目录(相当于$PWD
bash 中)时效果不佳。
因此,当通过 运行该命令时cmd
,我会在第一列中看到当前工作目录而不是提交日期!
混帐巴什:
2015-10-08 commit msg
2015-10-08 commit msg
2015-10-07 commit msg
2015-10-06 commit msg
2015-10-06 commit msg
命令:
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
D:\git\someFolderCreset commit msg
实际上,我cmd
自己从来没有直接使用过,我在编写 nodejs (0.12) 脚本时发现了这种行为
require('child_process').execSync('git log --format=...', {stdio: 'inherit'})
它由节点使用cmd
Windows 上的 when 执行)。
一个简单的解决方法可能是引入一个空间以防止%cd%
被发现,即更改
git log --format="%C(cyan)%cd%Creset %s" --date=short -5
到
git log --format="%C(cyan)%cd %Creset%s" --date=short -5
然而,这引入了一个冗余空间(我之前删除了另一个空间,%s
但它仍然是一个 hack,需要手动干预)。
有没有办法防止 Windows shell 扩展?
我找到了有关使用%%
或^%
逃避的信息,%
但它们不是这里的解决方案:
# produces superfluous ^ characters
git log --format="%C(cyan)^%cd^%Creset %s" --date=short -5
^2015-10-08^ commit msg
^2015-10-08^ commit msg
^2015-10-07^ commit msg
^2015-10-06^ commit msg
^2015-10-06^ commit msg
# seems the expansion is done at command parse time
git log --format="%C(cyan)%%cd%%Creset %s" --date=short -5
%D:\git\someFolder commit msg
%D:\git\someFolder commit msg
%D:\git\someFolder commit msg
%D:\git\someFolder commit msg
%D:\git\someFolder commit msg
理想的解决方案应该与 bash 和 cmd 兼容,而不会产生冗余字符,或者在 javascript 中使用转义函数来转义 Windows 的通用 UNIX-y 命令以防止扩展(如果可以创建这样的转义函数)。