git-archive一个子目录--

35

我正在使用 git-archive 命令来归档 git 仓库中的一个子目录,如下所示:

git archive -o ../subarchive.zip HEAD subdir/*

然而,生成的存档文件保持子目录/目录结构,即其内容如下:

subdir/
   whatever.js
   morestuff.js

我实际上想要whatever.js和morestuff.js位于归档的根目录中。怎么做?谢谢。

2个回答

57
你可以这样做:
git archive -o ../subarchive.zip HEAD:subdir

顺便提一下,玩转命令并查看其生成的简单方法是以以下形式使用它:

git archive --format=tar HEAD:subdir | tar t
git archive --format=tar HEAD subdir | tar t
# ... and so on ...

一旦找到所需内容,您可以更改格式并使用-o标记来实际创建档案。


2
有没有一种有效的方法来处理远程仓库,例如只获取一个巨大仓库中的一个目录/一个版本,而不是克隆整个仓库?我尝试了 --remote 但速度非常慢。 - R.. GitHub STOP HELPING ICE
可以,太好了。 我试图理解GIT文档的哪一部分讲述了这个问题,但没有成功。 请您详细解释一下? - Meglio
@Meglio,如果你在git archive --help命令中找不到某些内容,请告诉我(并尽可能具体地说明)。 - janos
1
请注意,如果当前工作目录不是存储库的根目录,则git仅从工作目录(和子目录)归档。要更改此设置,请使用上面的“:”符号-即只需使用“HEAD:”; HEAD:/HEAD:.无法正常工作。 - user234461
不过,出于某些原因,如果您使用此选项,则会忽略您的.gitattributes中的“export-ignore”语句。即使文件包含在您要导出的目录中,即使您使用了“--worktree-attributes”。 - rugk
好的,针对在这里与.gitattributes "export-ignore"一起使用的问题,我提出了一个单独的问题,但实际上并没有起作用:如何忽略“git archive”中的文件/目录,仅创建子目录的归档? - rugk

1
如果您使用git archive -o ../subarchive.zip HEAD:subdir,请确保使用Git 2.41(2023年第二季度)进行操作:

"git archive"(man)在子目录中运行时,会错误处理超出当前目录的属性和路径。

查看 提交 92b1dd1(2023年3月24日)由René Scharfe (rscharfe)提交。
(由Junio C Hamano -- gitster --合并于提交 de73a20,2023年4月21日)

存档:改进在子目录中运行的支持

报告者:Cristian Le
报告者:Matthias Görgens
签名作者:René Scharfe

当在子目录中启动git archive(man)时,它只会归档其对应的树和其子对象。
这是有意为之的。
它通过有效地进入该树并将"prefix"设置为空字符串来实现这一点。

然而,这样做会带来不幸的后果:属性被锚定在仓库的根目录上,而git archive仍然将其应用于子树,导致不匹配。
在检查路径规范时,它无法区分一个不匹配任何内容的路径规范和一个匹配子目录外某个实际blob的路径规范,从而导致了一个令人困惑的错误信息("current working directory is untracked")。

通过保留"prefix"值并将其传递给pathspec和attribute函数,并使用relative_path()缩短写入存档的路径(如果给出--verbose,则还会打印到stdout)来修复这个问题。

仍然拒绝尝试归档当前目录之外的文件,但在这种情况下打印更具体的错误信息("outside the current directory")。
然而,要识别它需要对每个路径规范进行完整的子树遍历。
允许它们可能更容易,但以"../"开头的存档条目路径可能在提取时出现问题--例如,默认情况下bsdtar会跳过它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接