在Powershell中返回Git commit id



我正在使用以下代码来 git 提交更改并返回提交

function gitcommit()
{
git commit -a -m "message"
$commitid= git rev-parse HEAD
git push -q
$comid=$commitid
return $comid
}
function main()
{
$commitid= gitcommit() 
Write-Host "Commit id is $commitid"

}

gitcommit函数中,我将获得正确的提交 id 作为7de234567f68fa8a3b40a95abc4d6d82a75d93。 但是我面临的问题是,在将提交 id 作为字符串返回时,它以 System 类型的形式出现包含以下内容的数组

On branch master, Your branch is up to date with 'origin/master'., , nothing to commit, working tree clean, On branch master, Your branch is up to date with 'origin/master'., , nothing to commit, working tree clean,7de234567f68fa8a3b40a95abc4d6d82a75d93

这里有一些事情:

  1. 您的函数返回一个对象数组,因为您没有抑制某些命令的输出。写入输出流的任何内容都将沿管道传递和返回
  2. return关键字不是必需的。在 PowerShell 中,return的功能更像Write-Output $variable; break- 它将变量写入输出流,然后返回到父范围。除非您希望在其余代码运行之前停止函数的执行,否则这不是必需的。
  3. 若要防止git commit命令使管道饱和,请将命令输出通过管道传输到Out-NullWrite-Host或其他流之一。我在这里写了一个答案,详细介绍了重定向和输出流。或者,您可以将-q开关与git pushgit commit一起使用来抑制其输出,但我建议改为将输出通过管道传输到Verbose流或Information流,如果您仍希望查看此信息,但不以编程方式对其进行操作。
  4. 这不会在这里给您带来问题,但不要调用带有括号()的 PowerShell 函数。是的,在静态或实例方法中使用括号,但将它们与函数一起使用最终会作为子表达式进行计算,这将有效地将多个参数组合成一个参数。
  5. 通过将[CmdletBinding()]属性添加到函数定义,可以在 cmdlet 上调用自动参数。例如,gitcommit -Verbose将为执行gitcommit启用详细流,您将能够看到原本冗长的输出。
  6. 请考虑在每个 git 命令后检查$LASTEXITCODE -eq 0- 该命令不能保证成功,在这种情况下,您可能希望输出不同的内容。

考虑到上述几点,您的代码可以像这样改进:

function gitcommit
{
[CmdletBinding()] 
git commit -a -m "message" | Write-Verbose
if( $LASTEXITCODE -ne 0 ){
Write-Warning "``git commit`` failed with exit code ${LASTEXITCODE}"
return # Return now because the commit failed
}
git rev-parse HEAD # This does not need to be returned because it outputs to the output stream
git push | Write-Verbose
if( $LASTEXITCODE -ne 0 ){
Write-Warning "``git push`` failed with exit code ${LASTEXITCODE}"
}
}
function main()
{
$commitid= gitcommit
Write-Host "Commit id is $commitid"
}

最新更新