GitHub API(v3):按创建日期排序标签

17

我在使用GitHub API时遇到了一个问题/疑问。

我需要列出单个标签后创建的所有标签的列表。唯一的方法是通过比较日期来完成。但是,API的结果并未按日期排序:

API的结果(rails存储库示例):

API results

Web界面的结果:

Webinterface results

我期望的是按日期排序的列表。但是,如您在图片中所见:API返回v4.0.0rc1和v4.0.0rc2在发布v4.0.0之前,而4.0.0在版本候选版之后发布。甚至没有可以在服务器端排序的创建/提交日期。

发布API也不是解决方案。此API仅返回由Github创建的发布,而不是由标签创建的发布。

有没有办法按日期排序标签?

提前致谢!

Ruben

4个回答

13

Repositories API 目前以 "git tag" 命令返回的顺序返回标签,这意味着它们按字母顺序排序。

在Git中按时间顺序排序标签存在问题,因为有两种类型的标签,即轻量级和附注型,对于轻量级标签,Git不存储创建日期。

Releases/Tags UI 目前通过指向的提交日期按时间顺序排序标签。这并非标签本身创建的日期,但它确立了一种时间顺序。

将这种备选排序选项添加到API功能请求列表中。


6
有什么新东西吗?如果能按日期排序标签就太好了 :) - davidmatas
2
目前在 REST 调用中,很遗憾还无法进行排序。 - sunder

8

使用GraphQL API v4,我们现在可以通过在orderBy中使用field: TAG_COMMIT_DATE按提交日期过滤标签。以下是按提交日期升序排序标签的示例:

{
  repository(owner: "rails", name: "rails") {
    refs(refPrefix: "refs/tags/", last: 100, orderBy: {field: TAG_COMMIT_DATE, direction: ASC}) {
      edges {
        node {
          name
          target {
            oid
            ... on Tag {
              message
              commitUrl
              tagger {
                name
                email
                date
              }
            }
          }
        }
      }
    }
  }
}

在浏览器中测试

在这里,target内的tagger字段仅对有注释的标签进行填充,对于轻量级标签则为空。

由于target中的xpath属性仅适用于使用注释创建的标签,因此可以轻松在客户端上按创建日期进行过滤(无需逐个检索所有标签)。

请注意,目前orderBy.field的可用选项为TAG_COMMIT_DATEALPHABETICAL(没有TAG_CREATION_DATE)。


3

编辑:现在可以使用GitHub GraphQL API实现此功能。

作为解决方法,有一个针对此问题的node模块,它基本上会获取每个标签的提交详细信息:github-api-tags-full

> npm install github-api-tags-full github moment

var GitHubApi  = require('github'),
moment     = require('moment'),
githubTags = require('github-api-tags-full');

var github = new GitHubApi({
  version: '3.0.0'
});

githubTags({ user: 'golang', repo: 'go' }, github)
.then(function(tags) {
  var tagsSorted = tags.sort(byAuthorDateAsc).reverse(); // descending
  console.log(tagsSorted); // prints the array of tags sorted by their creation date
});

var byAuthorDateAsc = function(tagA, tagB) {
  return githubCompareDates(
    tagA.commit.author.date,
    tagB.commit.author.date
  );
};
var githubCompareDates = function(dateStrA, dateStrB) {
  return moment(dateStrA).diff(dateStrB);
};

致以最好的问候


2

您可以使用Git References API

这也可以返回所有与特定前缀匹配的标签。

在您的情况下,您可能需要类似于以下内容:

https://api.github.com/repos/rails/rails/git/matching-refs/tags/v

或者在单体代码库的情况下:

https://api.github.com/repos/grafana/loki/git/matching-refs/tags/helm-loki-

缺点:

  • 排序: 结果按照semver递增的顺序进行排序,并且您将获得最早的结果。
  • 您不能获取有关每个标签的太多信息,可能需要从引用名称/路径中解析出版本。

优点

  • 您可以获取与之匹配的所有ref/tags(即没有分页,直到GitHub决定删除/优化为止 :))
  • 您可以使用它来过滤monorepo中的标签(这些标签很可能带有前缀标签标记发行组件)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接