有没有办法使用github API v3获取给定repo的最新标记

Var*_*oti 18 git github-api

我是github api的新手,我正在努力获得给定回购的最新标签.

问: 为什么我需要那个?

答: 作为QA,我负责测试并发布到LIVE,我们的团队拥有大约40件文物(github中的回购).我想构建一个工具,列出在最新标记之后提交的项目.这样我就可以更有效地管理版本.

即将到来.

根据Github api获得一个回购的所有标签

GET /repos/:owner/:repo/tags
Run Code Online (Sandbox Code Playgroud)

但是这给出了repo具有的完整标签列表.

有没有一种简单的方法可以找到最新的标签,而无需迭代上述api调用中的所有可用标签?

如果我遍历每个标签以找到最新的标签(基于每个标签的时间戳),那么随着时间的推移,这显然不是有效的方式,标签的数量会增加,因为我想重复至少超过10个回购的相同过程.

任何帮助将受到高度赞赏.

提前谢谢了

eli*_*eli 22

我发现的最简单的(对于我没有“最新”且我不想签出分支的情况很有用)是:

curl  "https://api.github.com/repos/certbot/certbot/tags" | jq -r '.[0].name'
Run Code Online (Sandbox Code Playgroud)

这只是从(例如)相应的 certbot 标签页(位于https://github.com/certbot/certbot/tags)打印“最高”标签号

感谢https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c#gistcomment-2649739


Dan*_*scu 11

GitHub没有用于检索最新标记的API,因为它用于检索最新版本.这可能是因为标签可能是任意字符串,不一定是semvers,但它并不是真正的借口,因为标签有时间戳,GitHub通过其标签API返回它们时按字典顺序对标签进行排序.

无论如何,要获取最新标记,您需要调用该API,然后根据semver规则对标记进行排序.由于这些规则不重要(参见该链接的第11点),因此最好使用semver库(为浏览器移植).

var gitHubPath = 'iDoRecall/selection-menu';  // example repo
var url = 'https://api.github.com/repos/' + gitHubPath + '/tags';

$.get(url).done(function (data) {
  var versions = data.sort(function (v1, v2) {
    return semver.compare(v2.name, v1.name)
  });
  $('#result').html(versions[0].name);
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://rawgit.com/hippich/bower-semver/master/semver.min.js"></script>
<p>Latest tag: <span id="result"></span></p>
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 6

您可以考虑作为GitHub API的替代方案,使用“ 是否有一种简单的方法来“ git describe”远程存储库? ”(source,by svnpenn)中提到的简单脚本:

#!/usr/bin/awk -f
BEGIN {
  if (ARGC != 2) {
    print "git-describe-remote.awk https://github.com/stedolan/jq"
    exit
  }
  FS = "[ /^]+"
  while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) {
    if (!sha)
      sha = substr($0, 1, 7)
    tag = $3
  }
  while ("curl -s " ARGV[1] "/releases/tag/" tag | getline)
    if ($3 ~ "commits")
      com = $2
  printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha
}
Run Code Online (Sandbox Code Playgroud)

那确实提取了标签(以及更多),而无需克隆仓库。

注意:如Joels Elf 在下面评论中,请确保引用,而不是。/usr/bin/awkgawkmawk


Mat*_*ieu 5

您可以在以下位置获得最新版本 https://api.github.com/repos/$org/$repo/releases/latest

如果你只想要标签名称,你可以尝试这样的事情:

curl https://api.github.com/repos/$org/$repo/releases/latest -s | jq .name -r
Run Code Online (Sandbox Code Playgroud)

  • 如果存储库使用标签进行版本控制但不使用 GitHub 系统创建版本,则这将不起作用。一个真实的例子是在 GitHub 上进行开发但通过 drupal.org 发布的 Drupal 项目 (3认同)
  • 据我所知,您也无法禁用它们。但是,很有可能使用 GitHub 和 git 标签,而无需在 GitHub 上实际创建版本。 (2认同)

Ber*_*tel 5

使用GraphQL API v4,您可以按字母顺序或提交日期获取最后一个标签。例如按提交日期(例如,指向最近提交的标签):

{
  repository(owner: "bertrandmartel", name: "caipy-dashboard") {
    refs(refPrefix: "refs/tags/", first: 1, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
      edges {
        node {
          name
          target {
            oid
            ... on Tag {
              message
              commitUrl
              tagger {
                name
                email
                date
              }
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在资源管理器中测试它

请注意,如果标签是轻量级标签,则不会有taggermessage字段。您还可以field: ALPHABETICAL按字母顺序用于最后一个标签。

如果您想获取创建的最后一个标签(它可能不同于指向最近提交的标签,或按字母顺序排列的最后一个标签),则只能使用带注释的标签,因为它们的创建日期已存储并且将可在tagger现场使用。

要获取最后创建的标签,您将获取所有标签并data.repository.refs.edges.node.target.tagger.date在以下请求的响应中过滤字段中的最近日期:

{
  repository(owner: "google", name: "gson") {
    refs(refPrefix: "refs/tags/", first: 100, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
      edges {
        node {
          name
          target {
            oid
            ... on Tag {
              commitUrl
              tagger {
                date
              }
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在资源管理器中测试它