所以我想导出从特定提交ID开始直到今天的所有文件(可能包括后续提交),所以我这样做:
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commitId | xargs tar -rf output.tar
但是,似乎此输出文件仅在指定的提交ID($commitId
)中进行了修改。
我正在寻找的是它应该导出从指定的提交ID开始直到今天的所有文件(包括在这段时间内可能发生的任何进一步的提交)。
答案 0 :(得分:5)
git diff -z --name-only --diff-filter ACMRT ${commitId}~ HEAD | xargs -0 tar -rf output.tar
git diff
就足够了;您不需要使用git diff-tree
来查找提交范围内已更改文件名的列表。-z
中的git diff
选项和-0
中的xargs
确保使用NUL
输出字段终止符,否则任何带空格的路径/文件名都会导致你要打破的命令。${commitId}~ HEAD
列出了${commitId}
的父提交(包括该提交中的更改)和最近提交(HEAD
)之间的更改。答案 1 :(得分:3)
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}
中的更改将不计算在内。