windows - 如何获得确认所有未提交更改的工作目录哈希?

标签 windows mercurial

我的软件构建过程的一部分包括将工作目录父目录的哈希值转换为 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 sthg 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/

相关文章:

windows - 如何在 Windows 上修复 "perl is not recognized"?

version-control - 使用 Mercurial 的按功能分支工作流

mercurial - 将 hgrc 文件检查到 Mercurial

mercurial - 推送后如何自动将远程 mercurial 存储库保持在提示位置

c - 如何将 Windows 客户端设置为基于 Web 的 dll

windows - 在 Windows 中将多个文件的前缀重命名或删除为每个文件的编号

mercurial - 如何使用 http/ssh 协议(protocol)从克隆存储库推送到远程服务器存储库?

version-control - 如何用多个后代头来压制反复无常的修订

.net - 为什么 .NET 应用程序会阻止 Windows 关闭?

python - 锁定程序,使其无法访问外部文件,就像病毒扫描程序一样