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

And*_*ios 2 git bash github git-branch github-actions

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

遗憾的是,与本地分支不同,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"
Run Code Online (Sandbox Code Playgroud)

我只能看到master,看不到其他两个分支:

在此输入图像描述

有没有办法使用 Git API 读取所有 GitHub 分支,或者我被迫使用 GitHub API

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

Mar*_*tek 8

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

\n

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

\n
\n

对于触发工作流的 ref/SHA,默认情况下仅获取单个提交。设置fetch-depth: 0为获取所有分支和标签的所有历史记录

\n
\n

考虑到上述情况,要获取所有分支,您必须actions/checkout@v2根据文档调整工作流程中的步骤:

\n
\n

获取所有标签和分支的所有历史记录

\n
- uses: actions/checkout@v2\n  with:\n    fetch-depth: 0\n
Run Code Online (Sandbox Code Playgroud)\n
\n

现在,当您调用下一步时。喜欢:

\n
- name: List all the remote branches\n  run: git branch -r\n
Run Code Online (Sandbox Code Playgroud)\n

你应该得到预期的输出。

\n

谈论 Travis CI。文档对此也很清楚(请参阅\xc2\xa7Git Clone Depth)。您必须调整travis.yml禁用--depth标志:

\n
git:\n  depth: false\n
Run Code Online (Sandbox Code Playgroud)\n