通过GitHub API在Git标记中获取所有提交,仅返回第一个提交 [英] get all commits in a Git tag through GitHub API return only the first commit

查看:52
本文介绍了通过GitHub API在Git标记中获取所有提交,仅返回第一个提交的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在git标签中将所有提交抛出github api.我检入了

解决方案

目前尚不清楚技术上的约束是什么,因此这里是一个使用Node的示例解决方案,应说明可能的情况.

我相信/repos/:owner/:name/tags 返回的标签不是按创建日期排序,而是按字母顺序排列,所以我不得不过滤掉不匹配的标签版本regex可以捕获一些杂散的输入.为了确保顺序正确,我使用了 semver npm软件包根据版本对它们进行排序.

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

 //API客户端,用于使用promise处理GitHub数据const {Octokit} = require("@ octokit/rest");//helper函数使用semver比较两个版本字符串const semverGt = require('semver/functions/gt');const owner ="RapidAPI";const repo ="ant-design";const octokit = new Octokit();octokit.repos.listTags({所有者,回购}).then(({{data:tags})=> {//过滤掉看起来不像发布的标签const sortedTaggedVersions = tags.filter(t => t.name.match(/\ d +.\ d +.\ d +/)).sort((a,b)=> semverGt(a.name,b.name));//这些是用于查找最新提交的输入//版本(又名"head"),但不在先前版本中(即"base")const head = sortedTaggedVersions [0] .name;const base = sortedTaggedVersions [1] .name;console.log(`比较基本$ {base}和head $ {head} ...)返回octokit.repos.compareCommits({所有者,回购根据,头,});}).then(({{data})=> {console.log(`Found $ {data.commits.length} commits:`);对于(data.commits的const c){让消息= c.commit.message;//仅显示提交消息的第一行以保持输出清洁const newline = message.indexOf("\ n");如果(换行> -1){消息= message.substr(0,换行符);}让author = c.author吗?`@ $ {c.author.login}`:null;如果(作者==空){//如果找不到GitHub提交者,则使用提交本身的名称author = c.commit.author.name;}console.log(`-$ {c.sha}-$ {author}-$ {message}`)}}).catch(err => {console.error(无法找到提交",err);}); 

这是结果:

  $节点index.js比较基础3.13.1和头3.13.2 ...找到19个提交:-4b526bf251fde5d4b6f1fec6d1ec3eb8805b4c75-@orzyyyy-文档:修复错误的逗号-736f5b9549a3de6d694786f63f835aa26c29d105-@ pine3ree-文档:处理message.info()调用中的无效日期-0d65f0578de652d2b3f5231088eaeaab95d8a3be -dependabot [bot]-:arrow_up:将@ types/react要求从〜16.7.13更新为〜16.8.1-c895c809f91e7ce817d9a42c4e0fd3ea5311d198-@ gyh9457-改进标签演示(#14701)-163140189f57c225dd49758f4ea2b8116f201dc9-@ashearer-修复引用渲染(#14708)-31d55e43b358c148640a7991b444c56e1cf25456-@ ycjcl868-更新:版本-976a6a5c5a2adb3c407e953b95df08f6810e0cd5-@ Josephus-P-修正了错别字并改进了语法-b6f81340baeec20caa8511693ea4ec7d7d0c0ba7-@ Josephus-P-零钱-777c56a515159a2eb7e809695def53d66aebfc10-@zombieJ-模拟测试-6f040b6c4090fbc060bf2a06a7a01b900f4fe890-@ ycjcl868-修复:严格检查输入-6cdc203a2fc58b5c89ea7bfe0ef361e7afdf95e6-@ ycjcl868-从ant-design/fix-form-test合并合并请求#14725-99eeefc25d38a2e2060c23de0f8446fd90729911-@imhele-开关中的正确类型(#14727)-2b558af9600c0d0fa56467b8de0522b2a4277232-@zombieJ-更新Silder快照(#14732)-b3834e48b1e009adbd142a7e2c38a129729170de-@imhele-表格:仅显示第一页的修复程序(#14724)-991b47f421bc3c60d30a8ff1d689615e6b70dbe1-@zombieJ-更新antd-tools版本以进行检查(#14738)-dfc9b24c989c58ffe6a922b45286e09450f85579-@GabeMedrash-正确键入onMouseEnter和onMouseLeave事件-5ad97a33d1d65f05a121796210e4fa15f2894c5c-@ afc163-:lipstick:改善移动设备中的首页样式-a9a6da47ed44d811e402822ec3933608405c27fb-@ thilo-behnke-输入:如果值为null(相对于未定义或empy字符串),则清除图标不会消失(#14733)-dab30ef2ccead39135ff6e4b215259344d812897-@zombieJ-更新变更日志(#14746) 

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

I'm trying to get all commits in a git tag throw github api. I checked in this stack overflow issue but in this way, it asks me to compare between two tags and it returns me only the first commit. I want to get all commits of a specific tag. what I used is

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

because I want to specific tag I added the same tag

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

it return me the only 2 commits but in the tag I have many commits as you can see here.

解决方案

It wasn't clear what the constraints were tech-wise so here is an example solution using Node that should illustrate what's possible.

I believe the tags returned by /repos/:owner/:name/tags are not sorted by date created, but instead alphabetically, so I had to filter out the tags that didn't match the version regex to catch some stray inputs. To ensure the order was correct I used the semver npm package to sort them based on version.

Then it was a matter of just using the Compare endpoint with the two latest tags in the repository.

// 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);
  });

This is the result:

$ 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)

This is different to the provided URL from the screenshot https://api.github.com/repos/RapidAPI/ant-design/compare/3.13.2...3.13.2 because it uses the version 3.13.2 for both tags.

这篇关于通过GitHub API在Git标记中获取所有提交,仅返回第一个提交的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆