21

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

我发现 Travis 正在测试我没有的其他提交的 repo。ref 是 refs/pull/81/merge。因此,据说有人将我的分支合并到 master 并创建了相应的 ref。是 GitHub 还是 Travis?

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

4

3 回答 3

19

我对 Travis 本身一无所知,但实际上 GitHub 确实创建了这些refs。特别是,根据观察——文档似乎有点少,我只是 GitHub 的一个比较随意的用户——当你点击 GitHub 中的“新拉取请求”时,GitHub:refs/pull/number/merge

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

请注意,这个自动创建的合并提交不在任何分支上,它只是分配了相同的拉取请求编号,以及一个名称从拉取请求本身显而易见的引用(只需替换headmerge)。我相信 - 但尚未手动测试 - 此合并的第一个父级是您请求某人在执行相同合并“开启”的分支的提示提交,即创建此引用的幕后代码是(或足够接近):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分离状态,因此必须在存储库锁定和工作后清理或使用临时工作树的情况下完成;实际代码序列可能对于任意数量的不同原因)。

因此:

因此,据说有人将我的分支合并到 master 并创建了相应的 ref。是 GitHub 还是 Travis?

鉴于 GitHubWilliam of Ockham会建议没有必要调用 Travis。:-)

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

只要您有权访问:

$ git ls-remote

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

于 2017-03-06T20:00:09.403 回答
18

如果您只想要 repo 中所有 ref 的列表,您可以运行:

git show-ref

这将打印<SHA> <NAME>下每个 ref 的.git/refs/*

于 2018-03-28T02:46:22.753 回答
4

一个答案提到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,但模式锚定到完整 ref 名称的末尾,并且只有完整的组件匹配,所以它只有在你知道你想要的分支名称或列出所有 refs 并 grep 时才有用。我想要一些整洁的东西,非常适合单列式。

于 2019-09-26T23:56:33.433 回答