如何使用 git-archive 获得 GNU tar 的 --strip-components 效果?

发布于 2024-10-15 08:44:35 字数 1538 浏览 4 评论 0 原文

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

为了举例说明,假设我只想要 gitweb 目录。运行

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

给出

git-gitweb/
git-gitweb/gitweb/
git-gitweb/gitweb/INSTALL
git-gitweb/gitweb/Makefile
git-gitweb/gitweb/README
git-gitweb/gitweb/gitweb.perl
git-gitweb/gitweb/static/
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/INSTALL
git-gitweb/Makefile
git-gitweb/...

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

$ git archive --prefix=git-gitweb/ --strip-components=1 master gitweb | \
  tar tf -
error: unknown option `strip-components=1'
usage: git archive [options]  [...] ...

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

freenode 的 #gnu 频道中有人建议 Tardy,但它不理解 git-archive

$ git archive master > old.tar
$ tardy old.tar new.tar
tardy: old.tar: file type ``g'' unknown

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

In broad terms, what I'd like is a direct tar-to-tar transformation where the result's root contains only a particular directory-subtree of the original.

To illustrate with an example, say I want only the gitweb directory from git's repository. Running

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

gives

git-gitweb/
git-gitweb/gitweb/
git-gitweb/gitweb/INSTALL
git-gitweb/gitweb/Makefile
git-gitweb/gitweb/README
git-gitweb/gitweb/gitweb.perl
git-gitweb/gitweb/static/
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

but I want

git-gitweb/
git-gitweb/INSTALL
git-gitweb/Makefile
git-gitweb/...

The manual provides for extra backend-specific options, but attempting to pass --strip-components produces an error:

$ git archive --prefix=git-gitweb/ --strip-components=1 master gitweb | \
  tar tf -
error: unknown option `strip-components=1'
usage: git archive [options]  [...] ...

The tar backend isn't GNU tar anyway.

Someone in freenode's #gnu channel suggested Tardy, but it doesn't understand the output of git-archive:

$ git archive master > old.tar
$ tardy old.tar new.tar
tardy: old.tar: file type ``g'' unknown

Yes, I could extract the output of git-archive with --strip-components and create a new archive of the result, but I'm trying to avoid using the filesystem as a temporary variable.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

树深时见影 2024-10-22 08:44:35

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

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

或者使用 git-archive 手册页建议的语法:

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

Archive that directory as the CWD and you won't have the extra path component:

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

Or use this syntax as suggested by the git-archive man page:

git archive --prefix=git-gitweb/ master:gitweb | tar tf -
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文