在 Windows 批处理文件中捕获 git 提交日期 (--format=%ci)?
Capturing git commit date (--format=%ci) in a Windows batch file?
目前,对于我的 C++ 项目,我 运行 一个预编译操作,它编写一个单独的头文件来捕获构建的 git 哈希,有效地让我能够准确地看到提交程序的任何实例是 运行ning 来自 运行ning.
到目前为止,类似这样的东西有效:
set file="%~dp0git_sha1.h"
echo #ifndef git_sha1H > %file%
echo #define git_sha1H >> %file%
set cmd=git rev-parse HEAD
set git_sha1=#define GIT_SHA1
for /f %%i in ('%cmd%') do set "git_sha1=%git_sha1% "%%i""
echo %git_sha1% >> %file%
echo #endif >> %file%
现在我正在尝试添加 HEAD 的提交日期,这将通过以下方式完成:git show -s --format=%ci HEAD
但是,在复制中间部分以适应此命令时,我 运行 出现各种错误,例如 fatal: ambiguous argument 'ci': unknown revision or path not in the working tree
、unknown pretty format 'ci'
等
我将范围缩小到 for 循环中的未转义字符,并想出了类似这样的东西
set cmd2=git show -s --format^=%%ci HEAD
set git_date=#define GIT_DATE
for /f %%i in ('%cmd2%') do set "git_date=%git_date% "%%i""
echo %git_date% >> %file%
然而,这仍然给了我 fatal: ambiguous argument '%ci: unknown revision or path not in the working tree.
我读到这个是因为转义的 ^=
没有被正确地传递到 git,所以它看到的是 --format %ci HEAD
而不是 --format=%ci HEAD
,但我并不完全确定我在哪里离开这里,特别是当单独的 echo %cmd2%
调试行确实显示正确的命令时。
有什么想法吗?
以下是我建议您编写代码的方式,以适当地使用双引号并写入您的 .h
文件:
@Echo Off
Set "file=%~dp0git_sha1.h"
Set "cmd=git rev-parse HEAD"
Set "git_sha1=#define GIT_SHA1"
Set "cmd2=git show -s --format=%%ci HEAD"
Set "git_date=#define GIT_DATE"
For /F "Delims=" %%A In ('%cmd%')Do Set "git_sha1=%git_sha1% "%%A""
For /F "Delims=" %%A In ('%cmd2%')Do Set "git_date=%git_date% "%%A""
(Echo #ifndef git_sha1H
Echo #define git_sha1H
Echo %git_sha1%
Echo %git_date%
Echo #endif)>"%file%"
请注意,我刚刚在您的输出文件中的 #endif
之前添加了您的 %cmd2%
输出。
目前,对于我的 C++ 项目,我 运行 一个预编译操作,它编写一个单独的头文件来捕获构建的 git 哈希,有效地让我能够准确地看到提交程序的任何实例是 运行ning 来自 运行ning.
到目前为止,类似这样的东西有效:
set file="%~dp0git_sha1.h"
echo #ifndef git_sha1H > %file%
echo #define git_sha1H >> %file%
set cmd=git rev-parse HEAD
set git_sha1=#define GIT_SHA1
for /f %%i in ('%cmd%') do set "git_sha1=%git_sha1% "%%i""
echo %git_sha1% >> %file%
echo #endif >> %file%
现在我正在尝试添加 HEAD 的提交日期,这将通过以下方式完成:git show -s --format=%ci HEAD
但是,在复制中间部分以适应此命令时,我 运行 出现各种错误,例如 fatal: ambiguous argument 'ci': unknown revision or path not in the working tree
、unknown pretty format 'ci'
等
我将范围缩小到 for 循环中的未转义字符,并想出了类似这样的东西
set cmd2=git show -s --format^=%%ci HEAD
set git_date=#define GIT_DATE
for /f %%i in ('%cmd2%') do set "git_date=%git_date% "%%i""
echo %git_date% >> %file%
然而,这仍然给了我 fatal: ambiguous argument '%ci: unknown revision or path not in the working tree.
我读到这个是因为转义的 ^=
没有被正确地传递到 git,所以它看到的是 --format %ci HEAD
而不是 --format=%ci HEAD
,但我并不完全确定我在哪里离开这里,特别是当单独的 echo %cmd2%
调试行确实显示正确的命令时。
有什么想法吗?
以下是我建议您编写代码的方式,以适当地使用双引号并写入您的 .h
文件:
@Echo Off
Set "file=%~dp0git_sha1.h"
Set "cmd=git rev-parse HEAD"
Set "git_sha1=#define GIT_SHA1"
Set "cmd2=git show -s --format=%%ci HEAD"
Set "git_date=#define GIT_DATE"
For /F "Delims=" %%A In ('%cmd%')Do Set "git_sha1=%git_sha1% "%%A""
For /F "Delims=" %%A In ('%cmd2%')Do Set "git_date=%git_date% "%%A""
(Echo #ifndef git_sha1H
Echo #define git_sha1H
Echo %git_sha1%
Echo %git_date%
Echo #endif)>"%file%"
请注意,我刚刚在您的输出文件中的 #endif
之前添加了您的 %cmd2%
输出。