【问题标题】:get all commits in a Git tag through GitHub API return only the first commit通过 GitHub API 获取 Git 标记中的所有提交仅返回第一个提交
【发布时间】:2020-08-05 03:20:59
【问题描述】:

我正在尝试在 git tag throw github api 中获取所有提交。 我签到了this stack overflow issue 但通过这种方式,它要求我在两个标签之间进行比较,它只返回第一个提交。我想获取特定标签的所有提交。 我用的是

https://api.github.com/repos/:org/:repo/compare/:tag_1...:tag_2

因为我想要特定的标签,所以我添加了相同的标签

https://api.github.com/repos/RapidAPI/ant-design/compare/3.13.2...3.13.2

它返回给我仅有的 2 个提交 但是在标签中我有很多提交,你可以在这里看到。

【问题讨论】:

  • 嗨,您是否尝试比较最新标签和前一个标签之间的提交?这有什么帮助吗? https://api.github.com/repos/RapidAPI/ant-design/compare/3.13.1...3.13.2
  • @Moayad.AlMoghrabi 我想以动态的方式来做,我不知道每个标签的前一个是什么..你有什么想法吗?
  • 我没有这么多经验,但我认为您可以将所有标签转发到您的 repo 它会为您从最新到最旧排序可以获得最新的两个标签并将它们相互比较..这有什么帮助吗?
  • 很遗憾没有那么多,我觉得这样做的查询成本很高。
  • 嗨,你找到解决这个问题的方法了吗?

标签: github github-api


【解决方案1】:

是的,我很高兴知道当同一个标签在做什么时..

为了解释/repos/:owner/:repo/compare/:base...:head API,我首先需要解释一下Git本身对应的API——如何获取提交列表。

如果您要运行 git log 3.13.2,它会做一些事情:

  1. 找出3.13.2 是一个标签(这里也可以使用分支、提交ID 或其他别名)
  2. 找到属于这个标签的提交
  3. 列出第一次提交的详细信息
  4. 检查此提交的第一个父级
  5. GOTO 3

然后它将继续遍历存储库的历史记录,直到您决定退出该过程。

但是如果我们只想回到某个点呢?这就是"commit ranges" 发挥作用的地方。

如果您在命令行上查找两个标签之间的提交,您可能会使用以下语法:

$ git log 3.13.1...3.13.2 --oneline                                                                                   
dab30ef2cc (tag: 3.13.2) update changelog (#14746)
a9a6da47ed Input: Clear icon doesn't disappear if value is null (vs undefined or empy string) (#14733)
5ad97a33d1 :lipstick: improve home page style in mobile device
dfc9b24c98 Properly type onMouseEnter and onMouseLeave events
991b47f421 update antd-tools version to check (#14738)
b3834e48b1 Table: fix showing only first page (#14724)
2b558af960 update silder snapshot (#14732)
99eeefc25d correct type in Switch (#14727)
6cdc203a2f Merge pull request #14725 from ant-design/fix-form-test
6f040b6c40 fix: strict check input
777c56a515 mock test
b6f81340ba small change
976a6a5c5a Fixed typos and improved grammar
31d55e43b3 upd: version
163140189f Fix quote rendering (#14708)
c895c809f9 improve tabs demo (#14701)
0d65f0578d :arrow_up: Update @types/react requirement from ~16.7.13 to ~16.8.1
736f5b9549 doc: handle invalid date in message.info() call
4b526bf251 docs: fix wrong comma

这就是/repos/:owner/:repo/compare/:base...:head API 的设计基础——以两个标签的形式提供您要查询的提交范围。但是,当您提供两次相同的标签时会发生什么?

$ git log 3.13.2...3.13.2 --oneline

不返回任何提交,因为 Git 认为您想从同一个标签中找到提交范围 - 这是一个空集。这就是 GitHub API 对您的初始 API 调用所做的事情。

【讨论】:

    【解决方案2】:

    不清楚技术方面的限制是什么,所以这里有一个使用 Node 的示例解决方案,应该说明什么是可能的。

    我相信/repos/:owner/:name/tags 返回的标签不是按创建日期排序的,而是按字母顺序排序的,因此我必须过滤掉与版本正则表达式不匹配的标签以捕获一些杂散输入。为了确保顺序正确,我使用了semver npm 包根据版本对它们进行排序。

    然后只需将比较端点与存储库中的两个最新标签一起使用即可。

    // API client for working with GitHub data using promises
    const { Octokit } = require("@octokit/rest");
    
    // helper function to compare two version strings using semver
    const semverGt = require('semver/functions/gt');
    
    const owner =  "RapidAPI";
    const repo = "ant-design";
    
    const octokit = new Octokit();
    
    octokit.repos
      .listTags({
        owner,
        repo,
      })
      .then(({ data: tags }) => {
        // filter out tags that don't look like releases
        const sortedTaggedVersions = tags.filter(t => t.name.match(/\d+.\d+.\d+/))
                                         .sort((a, b) => semverGt(a.name, b.name));
    
        // these are out inputs for locating the commits that are in the latest
        // release (aka "head") but are not in the previous release (aka "base")
        const head = sortedTaggedVersions[0].name;
        const base = sortedTaggedVersions[1].name;
    
        console.log(`Comparing base ${base} and head ${head}...`)
    
        return octokit.repos.compareCommits({
            owner,
            repo,
            base,
            head,
        });
      })
      .then(({ data }) => {
        console.log(`Found ${data.commits.length} commits:`);
        for (const c of data.commits) {
            let message = c.commit.message;
    
            // only show first line of commit message to keep output clean
            const newline = message.indexOf("\n");
            if (newline > -1) {
                message = message.substr(0, newline);
            }
    
            let author = c.author ? `@${c.author.login}` : null;
            if (author == null) {
              // use the name from the commit itself if we cannot find a GitHub committer
              author = c.commit.author.name;
            }
    
            console.log(` - ${c.sha} - ${author} - ${message}`)
        }
      })
      .catch(err => {
          console.error("Unable to find commits", err);
      });
    

    这是结果:

    $ node index.js
    Comparing base 3.13.1 and head 3.13.2...
    Found 19 commits:
     - 4b526bf251fde5d4b6f1fec6d1ec3eb8805b4c75 - @orzyyyy - docs: fix wrong comma
     - 736f5b9549a3de6d694786f63f835aa26c29d105 - @pine3ree - doc: handle invalid date in message.info() call
     - 0d65f0578de652d2b3f5231088eaeaab95d8a3be - dependabot[bot] - :arrow_up: Update @types/react requirement from ~16.7.13 to ~16.8.1
     - c895c809f91e7ce817d9a42c4e0fd3ea5311d198 - @gyh9457 - improve tabs demo (#14701)
     - 163140189f57c225dd49758f4ea2b8116f201dc9 - @ashearer - Fix quote rendering (#14708)
     - 31d55e43b358c148640a7991b444c56e1cf25456 - @ycjcl868 - upd: version
     - 976a6a5c5a2adb3c407e953b95df08f6810e0cd5 - @Josephus-P - Fixed typos and improved grammar
     - b6f81340baeec20caa8511693ea4ec7d7d0c0ba7 - @Josephus-P - small change
     - 777c56a515159a2eb7e809695def53d66aebfc10 - @zombieJ - mock test
     - 6f040b6c4090fbc060bf2a06a7a01b900f4fe890 - @ycjcl868 - fix: strict check input
     - 6cdc203a2fc58b5c89ea7bfe0ef361e7afdf95e6 - @ycjcl868 - Merge pull request #14725 from ant-design/fix-form-test
     - 99eeefc25d38a2e2060c23de0f8446fd90729911 - @imhele - correct type in Switch (#14727)
     - 2b558af9600c0d0fa56467b8de0522b2a4277232 - @zombieJ - update silder snapshot (#14732)
     - b3834e48b1e009adbd142a7e2c38a129729170de - @imhele - Table: fix showing only first page (#14724)
     - 991b47f421bc3c60d30a8ff1d689615e6b70dbe1 - @zombieJ - update antd-tools version to check (#14738)
     - dfc9b24c989c58ffe6a922b45286e09450f85579 - @GabeMedrash - Properly type onMouseEnter and onMouseLeave events
     - 5ad97a33d1d65f05a121796210e4fa15f2894c5c - @afc163 - :lipstick: improve home page style in mobile device
     - a9a6da47ed44d811e402822ec3933608405c27fb - @thilo-behnke - Input: Clear icon doesn't disappear if value is null (vs undefined or empy string) (#14733)
     - dab30ef2ccead39135ff6e4b215259344d812897 - @zombieJ - update changelog (#14746)
    

    这与屏幕截图 https://api.github.com/repos/RapidAPI/ant-design/compare/3.13.2...3.13.2 中提供的 URL 不同,因为它对两个标签都使用了版本 3.13.2

    【讨论】:

    • 嗨,布伦丹,感谢您的回答。我正在尝试获取特定标签的提交,而不是在获取所有标签后进行排序。我该怎么做?实际上我需要得到所有提交的用户,但是在我得到提交之后,我想很容易得到用户
    • “我该怎么做?”这是我不清楚的部分 - 如果您知道要比较哪些标签,可以将它们硬编码到第一部分以简化它。 “我需要获得所有提交的用户,但在获得提交后,我想很容易获得用户” GitHub 用户信息也可用于提交可以与 GitHub 用户匹配的地方。我已将其添加到示例中,如果有帮助,请告诉我。
    • 或者,如果您想更多地关注/repos/:owner/:repo/compare/:base...:head 在您使用相同标签时在这里所做的事情,我很乐意打开不同的答案。
    猜你喜欢
    • 2017-03-10
    • 2022-10-04
    • 1970-01-01
    • 2015-01-31
    • 2015-10-18
    • 1970-01-01
    • 2022-08-19
    • 2021-02-11
    • 1970-01-01
    相关资源
    最近更新 更多