所以我想导出从特定提交ID开始到今天的所有文件(可能包括后续提交),所以我这样做:
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commitId | xargs tar -rf output.tar
但是,似乎此输出文件仅在指定的commit id($commitId)中进行了修改.
我正在寻找的是,它应该导出从指定的提交ID开始直到今天的所有文件(包括在这段时间内可能发生的任何进一步的提交).
git diff -z --name-only --diff-filter ACMRT ${commitId}~ HEAD | xargs -0 tar -rf output.tar
Run Code Online (Sandbox Code Playgroud)
git diff足够了; 您无需使用git diff-tree查找提交范围中已更改文件名的列表.-zin git diff和-0in中的选项xargs确保使用NUL输出字段终止符,否则任何带空格的路径/文件名都将导致命令中断.${commitId}~ HEAD列出父提交之间的更改${commitId}(因此包含该提交中的更改)和最近的提交(HEAD).引用Git文档:
git diff-tree - 比较通过两个树对象找到的 blob 的内容和模式
...
如果只给出一个,则将提交与其父项进行比较(请参阅下面的 --stdin)。
在你的情况下,你只给出一个<tree-ish>,所以它与$commitId的父母进行比较。相反,您应该提供两个<tree-ish>es 以便进行比较。
假设提交位于 master 分支上并且 master 分支完全是最新的;那么下面的命令应该给出你想要的:
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT ${commitId}~1 master | xargs tar -rf output.tar
Run Code Online (Sandbox Code Playgroud)
~1之后的内容${commitId}是相对于 的父级进行比较${commitId},否则 的更改${commitId}将不会被计算在内。