如何防止 Windows 上包含字符串的 Mercurial 提交?

How to prevent Mercurial Commits containing string on Windows?

如果任何未提交的文件中存在以下字符串,我希望阻止提交到我的本地 Windows Mercurial 存储库:

DO NOT COMMIT ME

我知道预提交 hook I needpretxncommit。如果我在 Linux 我会做这样的事情:

[hooks]
pretxncommit.donotcommitme = hg export tip | (! grep -E -q -i 'do not commit me')

(取自 this link 而不是 verified/tested)

作为 egrep 的替代品,我有 FINDSTR /I /C:"do not commit",它似乎工作正常。但是我找不到 "negate" 上面 Linux 示例中的结果。

作为纯命令提示符命令的可能替代方法,我还在 this PowerShell script 中 运行 检查大型二进制文件。但是我不懂 PowerShell,所以这整件事对我来说都是胡言乱语。

有谁知道一种无需安装 Python、Cygwin 或其他任何软件即可完成我想要的操作的简单方法?或者您知道如何调整上述 PowerShell 脚本来进行字符串检查而不是文件大小检查吗?

我们也在使用 TortoiseHG,因此任何解决方案都可以使用它来代替纯 Mercurial。

事实证明,PowerShell 部分比我预期的要容易。我最终只是基于 this gist.

编写了自己的简单脚本

这里是给所有感兴趣的人的:

# This is like an "include" needed for the MessageBox
Add-Type -AssemblyName System.Windows.Forms

function Show-MessageBox()
{
    $message = "Found a ""DO NOT COMMIT ME"" message in your code!`r`n`r`nIf you are doing a pull or rebase this is probably okay.`r`n`r`nCommit anyway?"
    $title = "DO NOT COMMIT ME DETECTED!"
    $buttons = [System.Windows.Forms.MessageBoxButtons]::YesNo
    $icon = [System.Windows.Forms.MessageBoxIcon]::Warning

    [System.Windows.Forms.MessageBox]::Show($message, $title, $buttons, $icon)
}

# Use `hg export` to search for the string "do not commit me" (case insensitive)
write "Checking for DO NOT COMMIT ME comments in your code..."
$whoops = (hg export tip | Select-String -pattern "do not commit me");

# If we have it in our changeset, abort the commit!
if ($whoops)
{
    $a = Show-MessageBox

    if ($a -eq "Yes")
    {
        write "`r`n!!! COMMITING ANYWAY !!!`r`n"
        exit 0
    }

    write "`r`n*** ABORTING COMMIT! ***`r`n"
    exit 1
}

write "Okay to commit!"
exit 0

注意:我还必须使用 Set-ExecutionPolicy RemoteSigned 打开 运行 PowerShell 脚本的功能(同时 运行 将 PowerShell 作为管理员)。命令行 -ExecutionPolicy Bypass 标志无法正常工作并导致 TortoiseHG 出现各种问题!