为什么git ls-remote不能列出所有远程引用?

时间:2019-03-13 14:36:58

标签: git gitlab git-fetch git-ls-remote

我有一个远程存储库(origin),其refs目录除通常的headstagsremotes子目录外,还包含keep-aroundmerge-requests。这些特殊的裁判集由Gitlab管理,用于内部整理。

当我使用git ls-remote询问此存储库时,该命令列出了merge-requests引用而不是keep-around请求:

$ git ls-remote
5ef8f113ba35360de0dfc015601bb832bacb5505        HEAD
... lots of refs/heads/...
... lots of refs/merge-requests/...
... lots of refs/tags...

类似地,我可以获取merge-requests引用,例如,

$ git fetch origin refs/merge-requests/999/head
From git.company.com:Company/company
 * branch                    refs/merge-requests/999/head -> FETCH_HEAD

但是当我要求提供keep-around引用时,即使我知道确实存在,远程仓库也声称它不存在:

$ git fetch origin  refs/keep-around/291ad6a6bebf067377700d430ac130d758ed52e9
fatal: couldn't find remote ref refs/keep-around/291ad6a6bebf067377700d430ac130d758ed52e9
fatal: The remote end hung up unexpectedly

我在远程存储库的config中看不到与此相关的任何内容。是什么导致了不同的行为?


附录:Meredith Howard认为这可能是Gitlab的功能;有一个特殊的Gitlab配置,告诉它专门隐藏refs/keep-around中的引用。参见this support request from someone with a similar question


附录:已建议这是Git fetch a specific commit by hash的副本。我不是想通过哈希获取特定的提交。我想知道为什么远程回购会从列表中省略某些引用。

1 个答案:

答案 0 :(得分:1)

每个Git网站托管站点都可以通过该站点使用的任何配置机制(很可能是--system配置文件)来隐藏其喜欢的任何引用。 Git本身为此具有通用机制:transfer.hideRefs。有关详情,请参见the git config documentation。如果您运行自己的服务器,则可以通过这种方式进行设置。