不用 git 也能把代码到 Github 仓库上?😱😱😱

发布于:2024-04-25 ⋅ 阅读:(14) ⋅ 点赞:(0)

在我们的日常开发中,使用 git 是我们作为一个前后端开发者必备的工具了,无论你是将代码提交到 GayHub 上还是 gitlab 上。那么如果不使用你有没有办法将代码提交到 GayHub 仓库上呢?

接下来我们将来学习一下如何使用 NodeJs 将代码提交并且生成提交信息。

Github API

GitHub 提供了强大的 API,可以帮助我们自动化各种开发流程,从而提升开发效率。使用 NodeJs 来调用这些 API 是一种非常常见的做法。

以下是一些我们可以利用 NodeJs 和 GitHub API 实现的自动化任务:

  1. 仓库管理:自动创建、删除或更新仓库,包括仓库的描述、分支规则等。

  2. 问题和拉取请求管理:自动创建、更新和关闭 Issue 和 Pull Requests,还可以添加标签、分配责任人等。

  3. 内容操作:自动获取或更新仓库中的文件,提交代码等。

  4. Webhooks:使用 Node.js 创建服务来监听并响应 GitHub 发送的 Webhooks 事件,如推送事件、拉取请求事件等。

  5. CI/CD 流水线:自动化构建、测试和部署你的代码。

除此之外,还有很多很多功能,更多详细新信息可以查阅

创建 Token

开始之前,首先我们要创建一个 github 令牌,这个时候我们浏览器打开 Github 中点击我们帅帅的头像,如下图所示:

20240425212044

然后点击 settings,之后你会看到这样的页面:

20240425212134

拉到最底部,然后点击 Developer settings:

20240425212449

最后点击 Generate new token:

20240425212607

这里输入名字,然后选择 Only select repositories 并且选定仓库,最后给这些分配一些权限:

20240425212706

这里我就不讲分配什么权限了,反正我是全选了的哈哈哈哈。

20240425212758

这个时候我们已经拿到 Token 了,我们就可以随便玩了。

使用 Github API 来提交代码

在开始之前,我们要安装@octokit/core 库,它是 GitHub 官方提供的一个库,用于简化对 GitHub API 的调用。

pnpm add @octokit/core

之后我们编写如下代码,如下所示:

import { Octokit } from "@octokit/core";
import fs from "fs";
import path from "path";

const octokit = new Octokit({
  auth: `输入你自己的 Token`,
});

async function createOrUpdateFile(
  owner,
  repo,
  filePath,
  commitMessage,
  branch
) {
  const fullPath = path.resolve(filePath);
  const content = fs.readFileSync(fullPath, "utf8");
  const base64Content = Buffer.from(content).toString("base64");
  const fileName = path.basename(fullPath);

  try {
    const { data: getFileResponse } = await octokit.request(
      "GET /repos/{owner}/{repo}/contents/{path}",
      {
        owner,
        repo,
        path: fileName,
        ref: branch,
      }
    );

    // 如果文件存在,获取它的 sha 值以便更新
    const sha = getFileResponse.sha;
    const response = await octokit.request(
      "PUT /repos/{owner}/{repo}/contents/{path}",
      {
        owner,
        repo,
        path: fileName,
        message: commitMessage,
        content: base64Content,
        sha, // 提供 sha 用于更新文件
        branch,
      }
    );
    console.log("文件已更新", response.data);
  } catch (error) {
    if (error.status === 404) {
      const response = await octokit.request(
        "PUT /repos/{owner}/{repo}/contents/{path}",
        {
          owner,
          repo,
          path: fileName,
          message: commitMessage,
          content: base64Content,
          branch,
        }
      );
      console.log("文件已创建", response.data);
    } else {
      console.error("操作失败:", error);
    }
  }
}

createOrUpdateFile(
  "xun082",
  "algorithm",
  "./moment.md",
  "仍然自由自我,永远高唱我歌~",
  "main"
);

在上面的这些参数中,第一个是 Github 的账号名,第二个是仓库名,第三个是要变更的文件,第四个是提交的信息,第五个是分支名。

这个时候我们使用 Node 来执行代码,它在终端下输出的效果如下图所示:

20240425213746

这个时候我们打开 GayHub 仓库,发现文件已经更新了,提交信息也是有了的:

20240425213846

在这里我们就通过 Github API 的方式来提交我们的代码到了仓库上,全程并没有使用到 git 来提交。

其他案例

除了上面这些之外,我们还可以获取个人的账号信息,如下所示:

async function getUserInfo(username) {
  try {
    const response = await octokit.request("GET /users/{username}", {
      username: username,
    });
    console.log("账号信息:");
    console.log(`用户名: ${response.data.login}`);
    console.log(`名称: ${response.data.name}`);
    console.log(`公司: ${response.data.company}`);
    console.log(`地点: ${response.data.location}`);
    console.log(`公开的仓库: ${response.data.public_repos}`);
  } catch (error) {
    console.error(`获取用户信息出错: ${error}`);
  }
}

getUserInfo("xun082");

最终输出结果如下图所示:

20240425220830

还可以获取仓库的 Star 数量,分支等等。

总结

通过 Github API 我们可以做到很多事情,例如处理 issue 和 pr 这些都是可以的,在本文中我们通过这种方法允许你通过 API 操作 GitHub 仓库中的文件,而不需要在本地使用 Git 命令行工具。这对于自动化脚本或应用程序中直接从应用程序推送更新到仓库非常有用。