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

在我们的日常开发中,使用 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 中点击我们帅帅的头像,如下图所示:

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

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

最后点击 Generate new token:

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

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

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

使用 Github API 来提交代码

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

bash 复制代码
pnpm add @octokit/core

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

js 复制代码
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 来执行代码,它在终端下输出的效果如下图所示:

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

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

其他案例

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

js 复制代码
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");

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

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

总结

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

相关推荐
ekskef_sef6 分钟前
32岁前端干了8年,是继续做前端开发,还是转其它工作
前端
sunshine64131 分钟前
【CSS】实现tag选中对钩样式
前端·css·css3
Q_192849990634 分钟前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
真滴book理喻1 小时前
Vue(四)
前端·javascript·vue.js
蜜獾云1 小时前
npm淘宝镜像
前端·npm·node.js
dz88i81 小时前
修改npm镜像源
前端·npm·node.js
Jiaberrr1 小时前
解锁 GitBook 的奥秘:从入门到精通之旅
前端·gitbook
ZSYP-S1 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
程序员_三木1 小时前
Three.js入门-Raycaster鼠标拾取详解与应用
开发语言·javascript·计算机外设·webgl·three.js
Yuan_o_2 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端