我有一个简单的 GIT 脚本:
cp --parents $(git diff --name-only $1 $2) $3
git diff ...- 获取提交之间修改的文件列表($1 和 $2)。
cp --parents ...- 将它们复制到所需的目录($3)。
但唯一的问题存在:目录名称中存在空格。在这种情况下,脚本无法正常工作。显然,每一行git diff输出都应该用引号引起来,但是如何呢?
或者还有其他解决方案吗?还找不到。
git diff支持-z使用 NUL 分隔名称的选项。然后您可以通过管道将其通过xargs。例子:
$ git diff -z --name-only HEAD^ HEAD | xargs -I% -0 cp --parents "%" /tmp/
Run Code Online (Sandbox Code Playgroud)
选项xargs:
-0使其期望输入数据以 NUL 分隔;-I%让它在每个输入中运行一次命令,并%在命令行中替换为输入(显然是-i%在 Windows 上?)。%是任意选择的,因为它很短,您也可以使用-IFOO/ ;"FOO"cp ...要执行的命令。我用/tmp/作为一个安全的例子。
所以这应该有效地运行
$ cp --parents "file1" /tmp/
Run Code Online (Sandbox Code Playgroud)
等等。或者,您可以git diff在 Bash 中逐行读取输出。
$ git diff --name-only HEAD^ HEAD | ( while read fn ; do cp "${fn}" /tmp/ ; done )
Run Code Online (Sandbox Code Playgroud)