领大礼包前,怎么快速把公司代码仓全部拉下来,再愉快跑路🏃

背景

上个月俺正经历大礼包危机,小道消息刚传出来的时候,俺便以迅雷不及掩耳的速度,pull下了俺们前端组的所有代码仓,不论是俺的遗产,还是别人的遗产,都是必须带走滴!!!

but听俺的语气,各位看官就能猜到🤔,俺成功的🐶了下来,大礼包没拿成🥹(啊呸呸呸,谁爱拿大礼包谁拿去)。俺🐶下来的第一件事,当然是给各位看官分享,俺是如何以迅雷不及掩耳的速度down代码仓滴啦!!!

ready?go!!!正文开始~ 撒花迎接🎉

拿到group下的所有代码仓

第一步,俺得先把俺们前端组下的所有代码仓的名字先拿到手,俺就开始研究。


by the way,群组在这里找哦~ 都给俺点进来~

然后,运用俺们前端界的f12大法,你就发现了拿到group下仓库的接口。

拿到接口后,俺就发现,这破接口是分页的,没法一下子获取所有的,一页默认就20条。


but俺运用百度大法发现,它除了page参数外(页数),还有个per\_page的参数,可以指定获取条数,不过最多只能请求100条,应该是这个破接口写死的,哼哼,真烦人😡!!!

偏偏俺们组有147个仓库,超出了100个,再by the way一下,组下有多少个仓库在这看哈~

不怕不怕,就这点小事还能难倒俺?有总数不就行了,大不了循环嘛~


来来来~ 这就开干~ 先整段js拿到所有的仓库名。

js 复制代码
const getJson = () => 
new Promise(async (resolve) => {
  const total = 147 // 可以换成你们的仓库总数哦
  const perPage = 100 // 100条就100条!我计算一下还不行!
  const size = Math.ceil(total / perPage) // 诺,我算出来了,我就请求2次嘛,哼~
  let res = []
  for (let i = 1; i <= size; i++) {
    const url = `http://gitlab.这是我们公司的域名我得隐藏一下😁.com/groups/我们前端组的组名/-/children.json?page=${i}&per_page=${perPage}`
    const response = await fetch(url, {
      method: 'get',
      credentials: 'include' // 携带cookie
    })
    const data = await response.json()
    res.push(...data)
    if(i >= size){
      resolve(res)
    }
  }
})


const getRepos = async ()=>{
  const json = await getJson()
  console.log('仓库总数',json.length);
  const res = json.reduce((prev, curr) => {
    // 这个正则是匹配仓库名的,front是我们公司前端组的组名,你们换成你们自己公司的哈,接口上有的噢
    const name = /\/front\/([a-zA-Z-_0-9]*)/.exec(curr.relative_path)[1]
    prev += `"${name}"\n`
    return prev
  }, '')
  return res
}


console.log(await getRepos())

好~ 现在我把它放到浏览器里去执行一下,就能取到我想要的数据啦~

鉴于我觉得我可能会经常用,而且下次要用的时候还得写,我就直接在浏览器里创建一个代码片段存起来吧(会一直存在的噢,除非你卸载浏览器。)

执行它吧!耶~ 终于拿到所有仓库的名称啦!好,我们把它复制下来。

(关于公司的敏感信息我都马赛克了)

等等~咦~为什么要用这样的数据啊?哈哈~因为接下来我要写shell里啊~

shell脚本clone代码仓

接下来,开始我的表演,我们来建个.sh文件,把clone的逻辑写一下

shell 复制代码
#! /bin/bash

# 先来个友好的询问
read -p "是否在当前文件夹下克隆代码(yes/no):" flag

if [ "$flag" != "yes" ];then
	echo "请输入yes" exit
fi

echo "正在当前文件夹下克隆前端所有代码.....请稍后"

# 定义一个包含多个仓库URL的列表
# (把刚刚复制的数据粘贴将来即可)
repos=(
  "xx_in_app_purchase"
  "xx-front-new-open-class-live-mobile"
  ...
 )
 
# 遍历数组中的每个URL,并执行 git clone
for repo in "${repos[@]}"
do
  git clone "http://gitlab.这是我们公司的域名我得隐藏一下😁.com/我们前端组的组名/$repo.git"
done

很好懂吧!不用我解释啥吧,大家应该看得懂哈~

好,到此为止,拥有以上的代码,你就能成功clone下你们组的所有仓库啦~

but!!! but!!!俺还不满足,不满足!!!

shell脚本更新已有代码仓+clone新代码仓

因为俺开发的时候已经clone过很多项目了,执行脚本的时候,这些已经存在的项目就会提示已存在哦!可是俺想拉取最新的代码呀,之前开发的很多仓库很久没动了,总不能俺一个一个去pull一遍吧!

emmmm,这shell还得再改改,加个判断,修改后的脚本如下:

shell 复制代码
#! /bin/bash

read -p "是否在当前文件夹下克隆代码(yes/no):" flag

if [ "$flag" != "yes" ];then
	echo "请输入yes" exit
fi

echo "正在当前文件夹下克隆前端所有代码.....请稍后"

# 定义一个包含多个仓库URL的列表
# (把刚刚复制的数据粘贴将来即可)
repos=(
  "xx_in_app_purchase"
  "xx-front-new-open-class-live-mobile"
  ...
 )
 
# 遍历数组中的每个URL,并执行 git clone
for repo in "${repos[@]}"
do
  # 如果仓库已拉取过
  if [ -d "$repo" ] && [ -d "$repo/.git" ]; then
    # 进入该目录
    cd "$repo"
    # 切换到master
    git checkout master
    # 拉取最新代码
    git pull
    # 切回到原始目录,以便处理下一个仓库
    cd ..
  else 
  # 仓库未拉取过,clone下来
   git clone "http://gitlab.这是我们公司的域名我得隐藏一下😁.com/我们前端组的组名/$repo.git"
  fi
done

如此,就perfect啦!我注释写的很清晰吧!不用我额外解释哈~

好啦,把这个shell放到你的工作目录下吧,来~愉快的执行~

8分钟过去了(代码真多啊)终于~代码都down完啦!开心开心😁

完美~灰常完美~

如此,上午通知拿大礼包,上午就拉完代码啦!下午就愉快收拾收拾拿钱跑路咯~棒棒棒

各位看官学废了吧~ 学废了就给俺点个小星星啦✨

相关推荐
成都被卷死的程序员24 分钟前
响应式网页设计--html
前端·html
mon_star°43 分钟前
将答题成绩排行榜数据通过前端生成excel的方式实现导出下载功能
前端·excel
Zrf21913184551 小时前
前端笔试中oj算法题的解法模版
前端·readline·oj算法
文军的烹饪实验室2 小时前
ValueError: Circular reference detected
开发语言·前端·javascript
Martin -Tang3 小时前
vite和webpack的区别
前端·webpack·node.js·vite
迷途小码农零零发3 小时前
解锁微前端的优秀库
前端
王解4 小时前
webpack loader全解析,从入门到精通(10)
前端·webpack·node.js
我不当帕鲁谁当帕鲁4 小时前
arcgis for js实现FeatureLayer图层弹窗展示所有field字段
前端·javascript·arcgis
那一抹阳光多灿烂4 小时前
工程化实战内功修炼测试题
前端·javascript
放逐者-保持本心,方可放逐5 小时前
微信小程序=》基础=》常见问题=》性能总结
前端·微信小程序·小程序·前端框架