使用git diff为部署创建文件列表的问题
-
03-07-2019 - |
题
我想使用类似下面的命令来创建一个压缩包部署:
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。
不隶属于 StackOverflow