我的软件构建过程的一部分包括将工作目录父目录的哈希值转换为 C++ 字符串,以便包含在“版本”输出中。这是通过使用 hg identify -i
获取全局修订 ID,并将此输出复制到 .h 文件以包含在内来完成的。我在 Windows 批处理文件中执行此操作:
setlocal enabledelayedexpansion
for /f "tokens=1 delims=;=" %%a in ('hg identify -i') do (
echo const std::string revision^(_T^("%%a"^)^); > rev.h
)
这会将类似这样的内容输出到文件中:
const std::string revision(_T("3b746fd492c6"));
如果工作目录有任何未提交的更改,散列会附加一个 +
,使字符串 "3b746fd492c6+"
。这使我可以轻松检查我构建的软件版本是否受控 - 如果字符串包含 +
,则该软件无法从存储库中复制。
但是,hg identify
添加了一个+
来表示未提交的更改,但它不识别未跟踪的文件。如果我提交所有更改但忘记添加最重要的“做事”类,hg identify
将不会指示这一点。
所以我的问题是:如何获得所需的功能?
如何模拟 hg identify
识别新文件和删除文件?
理想情况下,我希望不必使用扩展程序,但会考虑将它们作为一种选择。
更新
根据 Oben Sonne 关于使用 hg st
和 hg id -r 的组合的建议。
我想出了以下批处理文件,它产生了一个很好的结果:
@echo off
set REPOMODS=
for /F %%a IN ('hg st -n') DO set REPOMODS=+
for /f "tokens=1 delims=;=" %%a in ('hg identify -i -r .') do (
echo const std::string revision^(_T^("%%a%REPOMODS%"^)^); > rev.h
)
%REPOMODS%
为空,除非 hg st
的输出中有任何内容,在这种情况下它是 +
。我已经做了一些测试,它似乎有效。
是否有另一种解决方案可以减少批处理文件中的麻烦?或者这是我能得到的最好的?
最佳答案
如何简单地检查 hg st
的输出是否为空?如果没有,请将 +
自己添加到版本中(如果 hg id
尚未给出)。
更新:为了防止双重 +
问题,您可以运行 hg id -r .
,它永远不会给您尾随 +
。
关于windows - 如何获得确认所有未提交更改的工作目录哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5094616/