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

相关推荐
brzhang4 分钟前
别再梭哈 Curosr 了!这 AI 神器直接把需求、架构、任务一条龙全干了!
前端·后端·架构
Kagol12 分钟前
TinyEditor v4.0 alpha 版本发布,更强大的表格、更丰富的表情、体验更好的图片/视频/文件上传功能
前端·开源
The_era_achievs_hero17 分钟前
微信131~140
开发语言·javascript·微信
安妮的心动录18 分钟前
安妮的2025 Q2 Review
后端·程序员
程序员爱钓鱼19 分钟前
Go语言数组排序(冒泡排序法)—— 用最直观的方式掌握排序算法
后端·google·go
然我22 分钟前
路由还能这么玩?从懒加载到路由守卫,手把手带你解锁 React Router 进阶技巧
前端·react.js·面试
Victor3561 小时前
MySQL(140)如何解决外键约束冲突?
后端
Victor3561 小时前
MySQL(139)如何处理MySQL字符编码问题?
后端
良木林1 小时前
JavaScript书写基础和基本数据类型
开发语言·前端·javascript
007php0072 小时前
服务器上PHP环境安装与更新版本和扩展(安装PHP、Nginx、Redis、Swoole和OPcache)
运维·服务器·后端·nginx·golang·测试用例·php