使用node一键拉取github仓库

3,036 阅读2分钟

背景

假如您在本地创建了很多仓库,又恰好碰到了重装系统的问题。导致本地项目全部丢失,当你想去开发时,却又不得不面临重新克隆仓库,便会面临重复的步骤,和我们封装的思想有点违背。于是,有了这个script诞生。

image.png

再假如您有阅读过我的上一篇文章,那么你便了解zx这个工具库,此项目便是基于zx进行开发。 没有可以移步# zx, 如何用Javascript优雅的书写脚本命令方便了解前置知识。

准备

安装 zx

搭建项目,安装zx,并创建zx可执行文件

#!/usr/bin/env zx

了解 github api

本文以 Repositories api进行参考使用

说明URL备注
请求urlapi.github.com/users/{user…
参数1affiliation隶属关系
参数2direcion排序方式,asc升序,desc降序
参数3page分页
参数4sort
参数5visibility隶属关系

image.png

本篇文章只用到了其中一个api,更多api简介详细参考# 打造App-GitHub 开放API大总结

script

获取仓库列表

我们先直接调用github api接口,打印会输出什么内容

const user = 'chris-zhu' // github 用户名
const data = await fetch(`https://api.github.com/users/${user}/repos`)
const urls = await data.json()

image.png

我们可以看见几个详细信息,首先该接口返回的是一个仓库信息[],每条仓库信息都描述了该仓库的详细信息,仓库的idnameurldescriptionfork··· 所以我们可以筛选有用信息,比如我们只想拿到该${user}的原创(非fork)项目

于是我们进行筛选

const repos = urls.filter((info) => !info.fork).map((info) => info.git_url)

创建文件夹

我们需要创建一个文件夹用来存放clone的项目,并用 cd() 命令进入该文件夹

await $`rm -rf ${dir}`
await $`mkdir ${dir}`
cd(`./${dir}`)

clone

我们可以结合promise使用,去循环拉取我们的仓库地址

Promise.all(repos.map((url) => $`git clone ${url}`))

image.png

image.png

image.png

我们已经完成所有的克隆脚本编写,当然我们可以更加灵活的传参,更好的调用 所以我们可以在package.json中的项目配置。

参数配置

① 修改配置文件

package.json中切换需要克隆地址的用户名

"scripts": {
    "clone": "npx zx src/clone/index.mjs"
 },

"config": {
    "port": "1111",
    "dir": "repos",
    "user": "CHANGE YOUR GITHUB_USERNAME"
},

Then,使用脚本命令

npm run clone

// or

yarn run clone

② 使用脚本命令传参

通过命令传参的方式注入

npm run clone -- xxx // xxx is your github_username

or

yarn run clone -- xxx // xxx is your github_username

script中接受参数

let [, , , user] = process.argv
user = user || process.env.npm_package_config_user // 克隆用户名
const dir = process.env.npm_package_config_dir // 克隆目录存放的文件夹

完美。