如何列出所有远程引用?

How do I list all remote refs?

最近我在 GitHub 上创建了一个 PR,但一些测试失败了。而在本地甚至更多的测试没有通过。所以我试图找出问题所在。

我发现 Travis 正在测试 other commit 我没有的回购协议。参考号是 refs/pull/81/merge。因此,据说有人将我的分支合并到 master 中并创建了相应的 ref。是 GitHub 还是特拉维斯?

另一个问题,我可以列出 GitHub 存储库的所有参考文献吗?

我对 Travis 本身一无所知,但 GitHub 实际上创建了这些 refs/pull/<em>number</em>/merge 参考文献。特别是,根据观察——文档似乎有点简陋,我只是一个有点随意的 GitHub 用户——当你在 GitHub、GitHub 中单击 "new pull request" 时:

  • 创建一个名为 refs/pull/<em>number</em>/head 的引用以保存您向其他人询问的提交 ID为您合并;
  • 尝试执行自动合并和提交(使用 git merge),并且 如果成功,创建第二个引用 refs/pull/<em>数</em>/合并.

请注意,这个自动创建的合并提交不在 任何 分支上,它只是分配了相同的拉取请求编号,以及一个名称从拉取中显而易见的引用-请求本身(只需将 head 替换为 merge)。我相信——但还没有手动测试——这个合并的第一个父级是你请求某人 "on" 当 他们same 合并,即创建此 refs/pull/<em>number</em>/merge 引用的幕后代码是(或足够接近):

commithash=...                         # the commit ID for the pull-request
mergeinto=$(git rev-parse $branchname) # the branch we are to merge into
prnum=...                              # get next pull request number

# create the pull request itself
git update-ref refs/pull/$prnum/pull $commithash

# create the merge ref, if the merge succeeds
git checkout $mergeinto
if git merge -m "..." refs/pull/$prnum/pull; then
    # merge succeeded: create the merge ref
    git update-ref refs/pull/$prnum/merge HEAD
else
    # automatic merge failed, discard it
    git merge --abort
fi

(这个特定的代码序列与索引混淆,并使 HEAD 分离,所以它必须在存储库锁定和 post 工作清理的情况下完成,或者使用临时工作-tree;由于多种原因,实际代码序列可能不同)。

因此:

So, somebody supposedly merged my branch into the master and created corresponding ref. Was it GitHub or Travis?

鉴于 GitHub William of Ockham 将建议无需调用 Travis。 :-)

And the other question, can I list all the refs GitHub repo has?

只要您有权限:

$ git ls-remote

(假设遥控器是 GitHub URL)将显示所有暴露的引用。我还没有看到执行此操作的 Web 界面方法,在我(轻度)阅读 GitHub API 文档时也没有找到。

如果你只想在你的 repo 中获得所有引用的列表,你可以 运行:

git show-ref

这将打印 .git/refs/*

下每个参考的 <SHA> <NAME>

一个答案提到了 git ls-remote - 虽然这对我的用例来说通常有效,但我需要列出遥控器 git 认为 的内容 - 例如.当服务器的管理员清理我陈旧的远程存储库并且我想使用我的本地 git 克隆恢复它们时。

列出我曾经使用过的所有已知远程引用 ls .git/refs/remotes/<name>/ - 事实证明在某些情况下它是不够的,例如在 git-p4 存储库中我的远程引用之一仅在 .git/packed-refs.

使用 git branch -r 可以,但输出无法清晰地解析,需要 grep'ing 所需的远程引用。

经过一番挖掘,我最终使用了 git for-each-ref:

git for-each-ref --format="%(refname)" refs/remotes/<name>/

注意:git show-refs 也可以列出引用,但模式锚定在完整引用名称的末尾并且只匹配完整的组件,所以只有当你知道你想要什么分支名称时它才有用列出所有 refs 并 grep 它们。我想要一些整洁的东西,很适合放在单衬里。