我创建了一个简单的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
答案 0 :(得分:5)
从PowerShell运行cmd /c echo $FromTag..$ToTag
,您将在第一个变量后面看到一个空格:
v041.3.2 ..v041.3.6
使用双引号将其作为一个参数原样传递(引号不会被传递给程序):
git diff "$FromTag..$ToTag"