从广义上讲,我想要的是直接的 tar 到 tar 转换,其中结果的根仅包含原始目录的特定目录子树。

为了举例说明,假设我只想要 git 存储库中的 gitweb directory。运行

$ git archive --prefix=git-gitweb/master gitweb | tar tf -



git-gitweb/
git-gitweb/gitweb/
git-gitweb/gitweb/安装
git-gitweb/gitweb/Makefile
git-gitweb/gitweb/自述文件
git-gitweb/gitweb/gitweb.perl
git-gitweb/gitweb/静态/
git-gitweb/gitweb/static/git-favicon.png
git-gitweb/gitweb/static/git-logo.png
git-gitweb/gitweb/static/gitweb.css
git-gitweb/gitweb/static/gitweb.js

但是我想要

git-gitweb/
git-gitweb/安装
git-gitweb/Makefile
git-gitweb/...

manual 提供了额外的后端特定选项,但尝试传递 --strip-components 会产生错误:

$ git archive --prefix=git-gitweb/--strip-components=1 master gitweb |\
tar tf -
错误:未知选项`strip-components=1'
用法:git archive [选项] [...] ...

无论如何,tar 后端都不是 GNU tar。

freenode 的 #gnu channel 中有人建议 Tardy ,但它不理解 git-archive 的输出:

$ git存档主> old.tar
$ tardy old.tar new.tar
迟到:old.tar:文件类型“g”未知

是的,我可以使用 --strip-components 提取 git-archive 的输出并创建结果的新存档,但我试图避免使用文件系统作为临时变量。

最佳答案

将该目录存档为 CWD,您将没有额外的路径组件:

(cd gitweb; git archive --prefix=git-gitweb/ master .) | tar tf -

或者按照 git-archive 手册页的建议使用此语法:
git archive --prefix=git-gitweb/ master:gitweb | tar tf -

关于linux - 如何使用 git-archive 获得 GNU tar 的 --strip-components 效果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4876525/

10-10 05:11