likes
comments
collection
share

一次七拐八折的 Git 仓库协作者用户名的获取过程

作者站长头像
站长
· 阅读数 18

背景

目前我们的多端项目中的小程序开发,每次都要手动在开发者工具中进行上传操作,并填写版本信息。

我计划实现小程序端的自动化发布,正好川哥有一篇相关工具库的文章

文章中提到了两个第三方库,我都可以直接用。

但是,终于要提到本篇的主题了。

在自动化发布之后,开发者为 ci 机器人的名称,如下图:

一次七拐八折的 Git 仓库协作者用户名的获取过程

这样一来,没办法知道具体是哪位开发者提交的版本。

于是,我接受建议,采用获取 Git 仓库里协作者用户名+拼接到项目备注方式,这样一来前面的困扰就被解决了。

Git 手册里真没有

原本借助上一篇获取 Git 仓库中 tags 信息的经验,我一上来就自然而然,打开了 Git 手册,查找可用的命令。

但是,我并没有找到。

git + 远程仓库url + user.name 这样的组合,几乎是不存在。

于是,我准备换个思路

没现成的功能,但有现成的参照

「换思路」,这话说着简单,实际操作起来很难。问题就在于没思路

差不多快要放弃的时候,我来了灵感,我记得 VSCode 里面有个插件,可以回显上传代码的协作人、操作时间和 commit 内容,具体展示如下图:

一次七拐八折的 Git 仓库协作者用户名的获取过程

Git History

Git History,一个可以查看和搜索git日志以及图表和详细信息的强大插件。

它的源码内容不算多,且文件命名语义性挺强的。在我的一番努力下,找到了获取协作人信息的代码块

原来可以通过 Github API 获取账号信息。

一次七拐八折的 Git 仓库协作者用户名的获取过程

tips:

通常我找不到实现方案的时候,就会去找有没有第三方插件有类似的功能,然后找到源码去看人家是怎么实现的。

像上面的功能,我也是找了很久没有找到实现方案。在 gitHistoryVSCode 源码中找到了实现方式。

GitHub API

Github API 提供的功能很丰富,但是我想要的功能偏定制化。

虽然它可以获取全部的协作人—— List repository contributors,但是跟我想要的当前上传代码的协作人需求不一致。而且,我并没有找到直接获取当前操作的协作人信息的方式。

于是,我换了种方式。可能这种方式不是最优,但是它是我目前想到的比较可行的方案。

获取最新的提交记录,取第一条中的协作人信息。

Github API 提供的获取提交记录列表的功能—— List commits

完整代码

1、首先来获取当前代码提交的协作人信息

import axios from 'axios';
/**
 * 获取当前代码提交的协作人信息
 * @param remoteUrl 远程仓库地址
 */
function getCurrContributor(remoteUrl) {
  const remoteRepoPath = remoteUrl.replace(/.*?github.com(/|:)/, '');
  // 需要获取信息的仓库名称
  const repoPath = remoteRepoPath.replace(/.git/?$/, '');
  const promise = axios.get(`https://api.github.com/repos/${repoPath}/commits`);

  return promise
    .then(response => {
      const commitList = response.data ? response.data : [];
      const author = commitList[0] && commitList[0].author ? commitList[0].author : {};
      return author;
    })
    .catch(() => {
      return {};
    });
}
getContributors('https://github.com/wxmp-project/wxmp-travel');

得到了想要的结果

一次七拐八折的 Git 仓库协作者用户名的获取过程

2、接下来需要将协作者固定到备注中,我把协作者的用户名作为固定后缀放到了自定义的描述信息之后。

/**
 * 获取小程序代码发布信息
 * @param info 当前上传的自定义版本信息
 */
async function getWxmpUploadInfo(info = {}) {
  const author = await getCurrContributor('https://github.com/wxmp-project/wxmp-travel');
  // 版本描述前缀
  const descPrefix = info.desc ? info.desc : '版本更新';
  // 版本描述后缀
  const descSuffix = `【by ${author.login}】`;
  let ciInfo = {
    version: info.version ? info.version : 'v1.0.0',
    desc: descPrefix + descSuffix,
  };
  return ciInfo;
}
const ciInfo = await getWxmpUploadInfo();
console.log(ciInfo);

获取一下版本信息结果,描述中加入了协作者的用户名。

一次七拐八折的 Git 仓库协作者用户名的获取过程

然而,事情并没有结束。

因为我们的项目的在 GitLab 上的,所以 GitHub API 就不适用了,需要寻找 GitLab 的实现方式。

GitLab API

我想,GitLab也应该是有提供API的,于是我搜了一下果然有。

GitLab API,和 GitHub API 用法还是有些不同的:

1、需要在请求头里面加入私有的 token:PRIVATE-TOKEN

2、API 请求的域名需要使用项目的域名;

3、API 请求中需要拼接具体项目id

4、响应体中的参数结构和 GitHub API 的不同。

personal access token

私有 token 的获取方式如下:

进入 GitLab 的配置页,找到 Access Tokens 页签,新增一个私人的 access token,添加完成后,会得到 token值。

一次七拐八折的 Git 仓库协作者用户名的获取过程

获取项目的 projectId

我没有在 GitLab 的页面里找到项目id的相关信息。但是可以通过 API 获取全部项目列表,从中找到对应的项目id.

API 接口

gitlab.example.com/api/v4/proj…

返回结果:

下图是官方给出的例子,其中 Diaspora Client 项目的 id 是4。

一次七拐八折的 Git 仓库协作者用户名的获取过程

获取 commits 列表

GitLab API 提供的获取提交记录列表的功能—— List repository commits

完整代码

import axios from 'axios';
function getCurrContributor(projectId) {
  const config = {
    headers: {
      'PRIVATE-TOKEN': 'Your personal access token',
    },
  };

  const promise = axios.get(`https://gitlab.example.com/api/v4/projects/${projectId}/repository/commits`, config);

  return promise
    .then(response => {
      const commitList = response.data ? response.data : [];
      const author = commitList[0] ? commitList[0] : {};
      console.log(author, 'author');
      return author;
    })
    .catch(() => {
      return {};
    });
}
const ciInfo = await getWxmpUploadInfo('1');
console.log(ciInfo);

未完待续

先总结一下本篇的主要内容:

1、通过 GitHub 和 GitLab 提供的 API,可以获取远程仓库的某些具体信息。

2、通过 commit 记录获得协作者信息。

补充

首先感谢川哥给到的专业建议,我这里想的却是有点偏,因为我使用的本地测试 js 文件,如果我再项目中进行功能测试可能不会走偏。

通过命令直接获取当前开发者的协作者信息,是非常可行的,川哥文章里已经实现,因为我还没有看源码,想先尝试自己去实现这个功能。如果有该功能需要的可以到川哥文章中看具体实现

当然我上面的各种尝试也不是白费功夫,上面总结的功能,可以被使用到获取第三方仓库的信息。

以上就是本次分享的内容。如果觉得有帮助,欢迎留言讨论、点赞 、收藏,持续产出技术分享。


我是 叶一一,非职业「传道授业解惑」的技术博主。「趣学前端」、「CSS畅想」系列作者。

华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。

欢迎技术或非技术问题的讨论。

本文正在参加「金石计划」