如何使用 CI 中的 Git API 读取 GitHub 存储库中的所有分支?

How can I read all the branches in a GitHub repo using the Git API from CI?

在 CI 系统中使用 Git API(例如 GitHub Actions 或 Travis-CI), 我想收集关于 repo 所有分支的信息。

遗憾的是,似乎 GitHub 分支机构与本地分支机构不同,它们彼此隔离。

假设我有一个包含三个分支的存储库(master 和其他两个从 master 创建):

如果我运行下面的脚本:

#!/usr/bin/env bash

printf "\n$ git for-each-ref --format='%(refname)' \n"
printf "$(git for-each-ref)\n"

printf "__________________________________________\n"

printf "\n$ git branch -a\n"
printf "$(git branch -a)\n"

我只能看到master,看不到另外两个分支:

有什么方法可以用 Git API 读取所有 GitHub 分支,或者我被迫使用 Git枢纽API?

我希望至少能够读取从我所在的分支生成的分支(master,在本例中)。我开始猜测 GitHub 会为自己保留这些信息,而不会以任何规范的 Git 方式公开它...

您必须在工作流作业中执行完整的存储库检出才能获得完整的存储库数据(包括所有分支)。当你在你的本地机器上执行 git clone...(没有像 --depth or --single-branch 这样的任何开关)时,你将获得所有存储库数据(标签、分支、提交历史等)。这就是 git branch -r 命令输出包含所有远程分支的原因。

在 GitHub Actions(或提到的 Travis CI)中,克隆操作的行为略有不同。默认情况下,为了节省带宽和磁盘存储 space,CI 系统仅检索存储库中所需的最少部分以执行工作流。这通常只是与工作流相关联的当前分支和有限的提交历史记录。这就是为什么您的命令没有 return 所有预期的分支。但是,您可以覆盖默认的结帐行为。如果您查看 actions/checkout docs:

Only a single commit is fetched by default, for the ref/SHA that triggered the workflow. Set fetch-depth: 0 to fetch all history for all branches and tags.

考虑到上述情况,要获取所有分支,您必须根据 the docs:

调整工作流程中的 actions/checkout@v2 步骤

Fetch all history for all tags and branches

- uses: actions/checkout@v2
  with:
    fetch-depth: 0

现在,当你在下一步调用时......喜欢:

- name: List all the remote branches
  run: git branch -r

你应该得到预期的输出。

谈论特拉维斯 CI。文档对此也很清楚(参见 §Git Clone Depth). You have to adjust your travis.yml to disable --depth flag:

git:
  depth: false