我创建了一个简单的PowerShell脚本,用于自动创建一个包含在两个git标签之间修改的所有文件的归档文件。
我已经进行了一些测试,看起来效果还不错。但今天,我的同事抱怨说它没有添加一个特定的文件。我开始调试它,发现了一个非常奇怪的行为。
正如您所看到的,我使用的命令是git diff,将从PowerShell命令参数(作为字符串)获取的to和from标签传递给它,以列出修改的文件。
我已经进行了一些测试,看起来效果还不错。但今天,我的同事抱怨说它没有添加一个特定的文件。我开始调试它,发现了一个非常奇怪的行为。
正如您所看到的,我使用的命令是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