背景
上个月俺正经历大礼包危机,小道消息刚传出来的时候,俺便以迅雷不及掩耳的速度,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完啦!开心开心😁
完美~灰常完美~
如此,上午通知拿大礼包,上午就拉完代码啦!下午就愉快收拾收拾拿钱跑路咯~棒棒棒
各位看官学废了吧~ 学废了就给俺点个小星星啦✨