我想使用类似下面的命令来创建一个压缩包部署:

tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

内git的差异命令产生文件的列表相对于包括相对路径,当我单独运行它。

我遇到了两个问题,我需要能够在输出中自动转义空格,因此tar不会抱怨包含空格的文件,并且当tar创建时,所有文件都有一个重复的'隐藏文件'前面有一个'。'不会出现ls -al 。这些是OSX特定的元文件,如kch所述。

无论如何,有没有人知道这些问题的解决方案,还是只有一种简单的方法来编写脚本?

有帮助吗?

解决方案

我用sed确定了以下解决方案。

tar cjf ~/deploy.tar.bz2 \
`git diff --name-only 0abc 1def|sed -e "s/ /\\\ /g"`

其他提示

隐藏的点文件,它们是点下划线文件吗?

如果对于文件 foo 你有另一个 ._ foo ,并且你在Mac上,那么点下划线文件就是保存文件资源fork / metadata的地方

对于git输出,可能会尝试通过 sed perl 进行引用。我相信 xargs 也可以在这里提供帮助。

为什么不使用tar的 - files-from = FILE -T FILE 选项,其中FILE可以是' - '来表示标准输入?

 git diff --name-only 0abc 1def | tar -T - cjf ~/deploy.tar.bz2

你不应该对文件名中的空格或制表符,或单引号,反引号或反斜杠有问题(我认为你的解决方案在文件名中会出现单引号''''的问题)。您可能会遇到文件名中的换行问题,就像在IFS解决方案中一样。

如果大小无关紧要,可以使用 git archive

我不确定是否可以创建仅包含两次提交之间差异的tarball。

你可以尝试

eval tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def | while read x; do echo "'""$x""'"; done`

或使用sed或

尝试相同的事情
IFS='
' tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

请注意,IFS中只有一个换行符。

但是,如果您的文件名称包含换行符,那么您将注定失败。

这是另一种更优雅的解决方案,适用于文件名中的转义空格

git diff --name-only 0abc 1def | \
    tr '\n' '\0' | \
    xargs -0 tar -rjvf ~/deploy.tar.bz2

正如jpalecek指出的那样,一个人不想跑“tar -c ......”。多次,最好使用-r。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top