【发布时间】:2018-12-09 16:32:41
【问题描述】:
保持文件结构,如git-archive
【问题讨论】:
-
是的。两次提交之间
-
哪个提交的内容应该进入归档文件?
-
所有文件内容,如命令“git archive -o update.zip”所做的
标签: git
保持文件结构,如git-archive
【问题讨论】:
标签: git
git archive 将文件路径作为参数,因此您可以执行以下操作:
git diff --name-status commit1 commit2 | awk '{ if ($1 != "D") print $2 }' | xargs git archive -o output.zip HEAD
更新
如果您的文件名包含空格,则以下内容将起作用:
git diff --name-status commit1 commit2 | awk '{ if ($1 != "D") printf("\"%s\"\n", substr($0,3)) }' | xargs git archive -o output.zip HEAD --
注意:存档中包含的文件的内容是它在 HEAD 中的内容。要使用来自其他提交的内容,只需将此命令末尾的 HEAD 更改为您想要的任何内容。
【讨论】:
git diff --name-status commit1 commit2 | awk '{ if ($1 != "D") printf("\"%s\"\n", substr($0,3)) }' | xargs git archive -o output.zip HEAD --
这是在提交标记 release 和 HEAD 之间存档更改的命令,也适用于包含空格、引号、双引号和任何特殊字符的文件名:
git diff --name-only -z --diff-filter=ACMRT release..HEAD | xargs -0 git archive -o update.tar.gz HEAD --
【讨论】:
感谢@Charles Duffy https://stackoverflow.com/users/14122/charles-duffy
感谢@Viperet 的回答。如果您有很长的要归档的文件列表,下面是插入暂停。 Xargs 将使用拆分参数多次运行相同的命令,因此它将始终生成带有最后一个拆分参数的存档 zip。为了纠正这个问题,一个快速的解决方法是在两者之间插入一个暂停。
再次感谢 Charles Duffy。 XARGS Long Arguments and Pause Between Commands
更新命令:
git diff --name-only -z --diff-filter=ACMRT release..HEAD | xargs -0 bash -c '"$@"; sleep 10' _ git archive -o update.tar.gz HEAD
希望它也对其他人有所帮助。
谢谢,
哈杰
【讨论】: