1

当我尝试git archive从不同目录在本地存储库上运行时

git archive --format=tar.gz --remote=file:///home/user/repos/repodir --prefix=/tmp/test_archive -o archive.tar.gz ref12345

此命令失败,输出如下。似乎不接受远程选项。

remote: fatal: no such ref: ref12345
fatal: sent error to the client: git upload-archive: archiver died with error
remote: git upload-archive: archiver died with error

当我切换到 repo 目录并在没有远程选项的情况下执行时,它很好。IE

cd /home/user/repos/repodir
git archive --format=tar.gz  --prefix=/tmp/test_archive -o archive.tar.gz ref12345

使用的 --remote 语法是否存在缺陷,或者本地存储库不支持 --remote 选项?

4

1 回答 1

0

这是一个老问题,但我看到了同样的问题,并在寻找解决方案时来到这里。

这实际上是在 中实现的安全控制的副作用,git-upload-archivegit archive --remote. 从文档的安全部分:git-upload-archive

即使最终结果可达,客户端也不能使用其他 sha1 表达式。例如,既不允许相对提交,master^也不允许文字 sha1 abcd1234,即使结果可以从 refs 中获得。

描述了一个禁用此行为的选项:

如果 config 选项uploadArchive.allowUnreachable为 true,则忽略这些规则,并且客户端可以使用任意 sha1 表达式。如果您不关心无法访问对象的隐私,或者如果您的对象数据库已经公开可通过非智能 http 访问,这将很有用。

但是,如果您能够在本地运行该命令,那么正如 OP 所发现的那样,通过git archive从存储库目录执行命令来完全避免该问题可能会更简单。我最终这样做了,类似于文档中的示例之一git archive

cd $REPO && git archive --format=tar $SHA1 | (cd $TARGET_DIR && tar xf -)

我在这个 Gitea 问题中遇到了这个解决方案。SO上的其他相关问题:

于 2021-05-18T08:37:02.827 回答