PowerShell Git diff传递from和to参数

5
我创建了一个简单的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
仅供测试,您能否像https://dev59.com/sWkw5IYBdhLWcg3wY5jq#9934012中那样声明git? - VonC
1个回答

8

从PowerShell运行cmd /c echo $FromTag..$ToTag,你会发现第一个变量后面有一个空格:

v041.3.2 ..v041.3.6

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

git diff "$FromTag..$ToTag"

为什么会添加一个空格,有任何线索吗? - Gimly
真正的答案可能埋藏在PS的源代码中,但看起来这是由解析器试图变得智能而引起的错误:显然,$a..$b被视为两个参数:一个变量+一个嵌入变量的字符串字面值。 - wOxxOm
是的,这很有道理。再加上git-diff解析器非常宽容,可以接受各种输入,这使得它成为一个相当奇怪的错误。如果没有你的帮助和聪明的测试方法,我可能会花费几个小时来解决它。谢谢。 - Gimly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接