如何使用命令git archive在两个git branch之间存档修改过的文件?

时间:2014-11-12 01:40:48

标签: git shell

我使用这样的命令来存档master和HEAD之间的修改文件:

git archive --format=zip -o diff_archive.zip HEAD `git diff --name-only master..HEAD`

但是,如果没有修改过的文件,工作副本中的所有文件都将被存档,有什么办法 避免这个?

现在,我能做的就是使用一个虚拟文件,然后像这样更改命令:

git archive --format=zip -o diff_archive.zip HEAD dummy_file `git diff --name-only master..HEAD`

它解决了我的问题,但并不优雅,因为dummy_file总是会被存档。

2 个答案:

答案 0 :(得分:1)

假设你不介意这个操作对于即使是略微奇怪命名的文件或包含空格也不安全。然后,您可以执行以下操作:

files=$(git diff --name-only master..HEAD)
git archive --format=zip -o diff_archive.zip HEAD ${files:-NO_SUCH_FILE}

git archive将在不存在的文件上出错。 (这使用Use Default Value的{​​{1}}版本。)

如果您希望避免错误,请使用Parameter Expansion

如果! _files = $(git diff --exit-code --name-only master..HEAD);然后     git archive --format = zip -o diff_archive.zip HEAD $ files 网络

(这需要git diff --exit-code来反转退出代码,因为!(如git diff本身)在有差异时退出diff,而1则退出不是任何)。

答案 1 :(得分:0)

以下是存档 HEAD 之间更改的命令,也适用于包含空格,引号,双引号,任何特殊字符的文件名:

git diff --name-only -z --diff-filter=ACMRT master..HEAD | xargs -0 git archive -o diff_archive.zip HEAD --