PowerShell Git diff传递和传递参数

时间:2016-09-08 10:10:51

标签: git powershell powershell-v4.0

我创建了一个简单的PowerShell脚本来自动创建包含在两个git标签之间修改的所有文件的存档。

我做过的一些测试看起来效果很好,但今天一位同事抱怨它没有添加特定的文件。我开始调试它,我看到一种非常奇怪的行为。

正如您所看到的,我用来列出修改过的文件的命令是git diff,它传递了我从PowerShell命令的参数(作为字符串)获取的to和from标签。

param(
    # Git tag or commit has from which we want the patch to start
    [String] $FromTag,
    # Path of the patch file
    [String] $PatchFilePath,
    # Git tag or commit hash where to we want the patch to update to (default HEAD, current checkout)
    [String] $ToTag = "HEAD"
)
...
$modifiedFiles = git diff $FromTag..$ToTag --no-commit-id --name-only --diff-filter=ACMRT 
...

测试它,我看到文件确实丢失了。我决定手动运行命令,如下所示:

git diff v041.3.2..v041.3.6 --no-commit-id --name-only --diff-filter=ACMRT

返回了文件...让我感到困惑。然后我尝试做以下事情:

$FromTag = "v041.3.2"
$ToTag = "v041.3.6"
git diff $FromTag..$ToTag --no-commit-id --name-only --diff-filter=ACMRT

这不会返回所有文件,而是返回它们的一部分。

然后我试着打电话给

git diff "v041.3.2".."v041.3.6" --no-commit-id --name-only --diff-filter=ACMRT

这给了我与变量完全相同的结果,只返回所有修改过的文件的子集。

我试图在“DOS”命令提示符下运行最后一个命令来检查它是否是一个git问题,但是它返回了正确的文件集。

当PowerShell将其作为字符串传递时,git如何解释输入似乎有所不同,但我真的不明白为什么以及如何。

以下是感兴趣的人的完整脚本:https://gist.github.com/Gimly/b865b0ed09f0f9fe13d12f6b0137ecfb

1 个答案:

答案 0 :(得分:5)

从PowerShell运行cmd /c echo $FromTag..$ToTag,您将在第一个变量后面看到一个空格:

  

v041.3.2 ..v041.3.6

使用双引号将其作为一个参数原样传递(引号不会被传递给程序):

git diff "$FromTag..$ToTag"