不用 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 命令行工具。这对于自动化脚本或应用程序中直接从应用程序推送更新到仓库非常有用。

相关推荐
我不会起名字3229 分钟前
未接入最终读上限的参数:`websocketMaxMsgLen` 与 12.5 倍差距
后端·websocket·go·即时通讯·im·故障排查
一条Go1 小时前
接收方合并去重:同一个人为什么只该收到一次通知
后端·架构·github
Lank_M1 小时前
白底都占八成,PNG 为何只在图表页赢过 JPG
前端
张一凡931 小时前
给 Coding Agent 加一道"架构闸门":Jin 是如何做到"先审架构、再写代码、不漂移"的
前端·后端·agent
Linye1 小时前
AI 写的 HTML 原型全是空壳?聊聊真实 DOM 交互避坑
前端·人工智能
Jvav练习生2 小时前
AI Agent 总在关键时刻“失忆”翻车?一文讲透上下文工程(附可运行 Python 代码)
后端
ZANE2 小时前
纯前端实现的 PDF 与图片互相转换工具技术实现
前端
leo在掘金2 小时前
只挂了11小时,5000台开发机被塞进SSH公钥
后端·架构
xjz18422 小时前
Rust 运算符优先级:括号不只用来改变顺序
后端