自从指定提交到今天,Git导出文件为zip / tar

时间:2017-01-05 10:46:52

标签: git bash

所以我想导出从特定提交ID开始直到今天的所有文件(可能包括后续提交),所以我这样做:

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commitId | xargs tar -rf output.tar

但是,似乎此输出文件仅在指定的提交ID($commitId)中进行了修改。

我正在寻找的是它应该导出从指定的提交ID开始直到今天的所有文件(包括在这段时间内可能发生的任何进一步的提交)。

2 个答案:

答案 0 :(得分:5)

git diff -z --name-only --diff-filter ACMRT ${commitId}~ HEAD | xargs -0 tar -rf output.tar
  1. git diff就足够了;您不需要使用git diff-tree来查找提交范围内已更改文件名的列表。
  2. -z中的git diff选项和-0中的xargs确保使用NUL输出字段终止符,否则任何带空格的路径/文件名都会导致你要打破的命令。
  3. ${commitId}~ HEAD列出了${commitId}的父提交(包括该提交中的更改)和最近提交(HEAD)之间的更改。

答案 1 :(得分:3)

引用Git documentation

  

git diff-tree - 比较通过两个找到的blob的内容和模式   树对象

...

  

如果只有一个给定,则将提交与其父项进行比较(请参阅下面的--stdin)。

在您的情况下,您只提供一个<tree-ish>,因此它与$commitId的父级进行比较。相反,你应该提供两个<tree-ish> es来进行比较。

假设提交在主分支上,主分支完全是最新的;那么以下命令应该给你想要的东西:

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT ${commitId}~1 master | xargs tar -rf output.tar

~1之后的${commitId}是如此进行相对于${commitId}父级的比较,否则${commitId}中的更改将不计算在内。