如何防止 Windows 上包含字符串的 Mercurial 提交?
How to prevent Mercurial Commits containing string on Windows?
如果任何未提交的文件中存在以下字符串,我希望阻止提交到我的本地 Windows Mercurial 存储库:
DO NOT COMMIT ME
我知道预提交 hook I need 是 pretxncommit
。如果我在 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 出现各种问题!
如果任何未提交的文件中存在以下字符串,我希望阻止提交到我的本地 Windows Mercurial 存储库:
DO NOT COMMIT ME
我知道预提交 hook I need 是 pretxncommit
。如果我在 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 出现各种问题!