当我尝试从不同的目录
在本地存储库上运行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目录并在没有远程选项的情况下执行时,它没问题。即
cd /home/user/repos/repodir
git archive --format=tar.gz --prefix=/tmp/test_archive -o archive.tar.gz ref12345
使用的--remote语法是否存在缺陷,或本地存储库不支持--remote选项?
答案 0 :(得分:0)
这是一个老问题,但我看到了同样的问题,并在寻找解决方案时来到这里。
这实际上是在 git-upload-archive
中实现的安全控制的副作用,它由 git archive --remote
调用。来自 the docs for git-upload-archive
的 Security 部分:
客户端不得使用其他 sha1 表达式,即使最终结果是可达到的。例如,既不允许像 master^
这样的相对提交,也不允许像 abcd1234
这样的文字 sha1,即使结果可以从 refs 获得。
描述了禁用此行为的选项:
<块引用>如果配置选项 uploadArchive.allowUnreachable
为真,这些规则将被忽略,并且客户端可以使用任意 sha1 表达式。如果您不关心无法访问对象的隐私,或者您的对象数据库已经可以通过非智能 http 公开访问,这将非常有用。
但是,如果您能够在本地运行该命令,那么正如 OP 所发现的那样,通过从存储库目录执行 git archive
命令来完全避免该问题可能更简单。我最终这样做了,类似于 one of the examples in the git archive
docs:
cd $REPO && git archive --format=tar $SHA1 | (cd $TARGET_DIR && tar xf -)
我在 this Gitea issue 中遇到了这个解决方案。此处有关 SO 的其他相关问题: