2

我想使用类似以下命令来创建要部署的 tarball:

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

当我单独运行它时,内部 git diff 命令会生成一个包含相对路径的文件列表。

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

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

4

6 回答 6

4

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

tar cjf ~/deploy.tar.bz2 \
`git diff --name-only 0abc 1def|sed -e "s/ /\\\ /g"`
于 2009-03-02T01:44:56.197 回答
3

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

如果foo你有另一个文件._foo,并且你在 Mac 上,点下划线文件是保存文件资源叉/元数据的地方。

至于 git 输出,可以尝试通过管道传输sedperl引用。我相信xargs在这里也可以提供帮助。

于 2009-03-02T01:31:44.183 回答
2

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

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

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

于 2009-03-02T14:50:28.680 回答
0

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

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

于 2009-03-01T21:10:07.153 回答
0

你可以试试

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 中只有一个换行符。

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

于 2009-03-01T22:15:22.940 回答
0

这是另一个更优雅的解决方案,可以解决文件名中的转义空格

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

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

于 2009-03-02T08:04:25.190 回答