如何列出所有远程参考?

时间:2017-03-06 12:47:57

标签: git github refs

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

我发现的事情是特拉维斯正在测试我没有的other commit的回购。 ref是refs / pull / 81 / merge。所以,有人应该将我的分支合并到主人并创建相应的引用。是GitHub还是Travis?

另一个问题,我可以列出GitHub repo的所有引用吗?

3 个答案:

答案 0 :(得分:9)

我对Travis本身一无所知,但GitHub确实创建了这些refs/pull/number/merge参考。特别是,基于观察 - 文档似乎有点吝啬,我只是GitHub的一个偶然的用户 - 当你点击GitHub中的“新拉请求”时,GitHub:

  • 创建一个名为refs/pull/number/head的引用,以保存您要求其他人为您合并的提交的ID;
  • 尝试进行自动合并和提交(使用git merge),尝试成功,创建名为refs/pull/number/merge的第二个引用。

请注意,这个自动创建的合并提交不在任何分支上,它只是分配了相同的pull-request编号,而且引用的名称在pull-request本身中很明显(简单来说)将head替换为merge)。我相信 - 但是还没有手动测试 - 这个合并的第一个父级是你要求某人在他们相同的的分支的提示提交合并,即创建此refs/pull/number/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分离,因此必须完成存储库锁定和后期工作清理,或使用临时工作树;实际代码由于各种原因,序列可能有所不同。)

因此:

  

所以,有人应该将我的分支合并到主人并创建相应的引用。是GitHub还是Travis?

鉴于GitHub William of Ockham会建议不需要调用Travis。 : - )

  

另一个问题,我可以列出GitHub repo的所有引用吗?

只要您有权访问:

$ git ls-remote

(假设远程是GitHub URL)将显示所有公开的引用。我还没有看到Web界面的方法来做到这一点,也没有在我的(轻松)细读GitHub API文档中找到它。

答案 1 :(得分:3)

如果您只想要回购中所有参考的列表,您可以运行:

git show-ref

这会在<SHA> <NAME>

下打印每个参考的.git/refs/*

答案 2 :(得分:0)

有一个答案提到了git ls-remote-虽然这对于我的用例来说通常是有效的,但我需要列出git 认为遥控器具有的功能-例如。当服务器的管理员清理过时的远程存储库,而我想使用本地git克隆还原它们时。

要列出我曾经使用过的所有ls .git/refs/remotes/<name>/已知远程引用-在某些情况下还不够,例如,在git-p4存储库中,我的一个远程引用仅在{{1}中列出}。

使用.git/packed-refs可以工作,但是输出不是完全可解析的,并且需要grep's所需的远程引用。

经过一番挖掘,我最终使用了git branch -r

git for-each-ref

NB:git for-each-ref --format="%(refname)" refs/remotes/<name>/ 也可以列出引用,但是该模式锚定在完整引用名称的末尾,并且仅匹配完整的组件,因此仅当您知道想要的分支名称或列出所有分支名称时,此选项才有用ref和grep他们。我想要整洁的东西,很适合一体式。