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

相关推荐
玩电脑的辣条哥2 小时前
Python如何播放本地音乐并在web页面播放
开发语言·前端·python
ew452182 小时前
ElementUI表格表头自定义添加checkbox,点击选中样式不生效
前端·javascript·elementui
suibian52352 小时前
AI时代:前端开发的职业发展路径拓宽
前端·人工智能
画月的亮2 小时前
element-ui 使用过程中遇到的一些问题及解决方法
javascript·vue.js·ui
Moon.92 小时前
el-table的hasChildren不生效?子级没数据还显示箭头号?树形数据无法展开和收缩
前端·vue.js·html
m0_526119402 小时前
点击el-dialog弹框跳到其他页面浏览器的滚动条消失了多了 el-popup-parent--hidden
javascript·vue.js·elementui
垚垚 Securify 前沿站2 小时前
深入了解 AppScan 工具的使用:筑牢 Web 应用安全防线
运维·前端·网络·安全·web安全·系统安全
m0_748256144 小时前
SpringBoot
java·spring boot·后端
多想和从前一样5 小时前
Django 创建表时 “__str__ ”方法的使用
后端·python·django
工业甲酰苯胺5 小时前
Vue3 基础概念与环境搭建
前端·javascript·vue.js