前言

今天跟同事交接项目组的工作,从公司的gitlab上看到,在这个group下面有很多仓库,且各个还有很多按业务分类的文件夹。我想将全部仓库全部clone到本地,但是git clone 不支持groups。用一个图更直观说明我的诉求,YM801这个组织下面有很多分类的文件夹和仓库。

正文

这时候只能google了,好在gitlab提供了api https://docs.gitlab.com/ee/api/groups.html,然后找到了两个重要的很好用的api

1.查询groups的api

GET /groups

返回结果如下

[{"id": 1,"name": "Foobar Group","path": "foo-bar","description": "An interesting group","visibility": "public","share_with_group_lock": false,"require_two_factor_authentication": false,"two_factor_grace_period": 48,"project_creation_level": "developer","auto_devops_enabled": null,"subgroup_creation_level": "owner","emails_disabled": null,"mentions_disabled": null,"lfs_enabled": true,"default_branch_protection": 2,"avatar_url": "http://localhost:3000/uploads/group/avatar/1/foo.jpg","web_url": "http://localhost:3000/groups/foo-bar","request_access_enabled": false,"full_name": "Foobar Group","full_path": "foo-bar","file_template_project_id": 1,"parent_id": null,"created_at": "2020-01-15T12:36:29.590Z"}
]

2.查询对应group下的porject

GET /groups/:id/projects

返回结果如下

[{"id": 9,"description": "foo","default_branch": "master","tag_list": [], //deprecated, use `topics` instead"topics": [],"archived": false,"visibility": "internal","ssh_url_to_repo": "git@gitlab.example.com/html5-boilerplate.git","http_url_to_repo": "http://gitlab.example.com/h5bp/html5-boilerplate.git","web_url": "http://gitlab.example.com/h5bp/html5-boilerplate","name": "Html5 Boilerplate","name_with_namespace": "Experimental / Html5 Boilerplate","path": "html5-boilerplate","path_with_namespace": "h5bp/html5-boilerplate","issues_enabled": true,"merge_requests_enabled": true,"wiki_enabled": true,"jobs_enabled": true,"snippets_enabled": true,"created_at": "2016-04-05T21:40:50.169Z","last_activity_at": "2016-04-06T16:52:08.432Z","shared_runners_enabled": true,"creator_id": 1,"namespace": {"id": 5,"name": "Experimental","path": "h5bp","kind": "group"},"avatar_url": null,"star_count": 1,"forks_count": 0,"open_issues_count": 3,"public_jobs": true,"shared_with_groups": [],"request_access_enabled": false}
]

观察第二个api,有两个很重要的返回字段 ssh_url_to_repohttp_url_to_repo ,这不就是我们需要clone的地址吗,皇天不负有心人,有了这两个api就可以完美解决我们的问题了。接下来要准备access_token,这个就不赘述了,关于怎么获取access_token,自行百度。

同时衍生出了第二个问题,我想让clone下来的仓库,跟远程仓库保持同样的文件夹结构,而不是所有的仓库都在同一个文件夹下。万幸的是,咱的电脑上之前装过python,所以我选择用python脚本实现我的需求,这就体现出了脚本语言的好处,不管你精通不精通,看着教程就能写,哈哈哈。

脚本如下:

from urllib.request import urlopen
import json
import subprocess,shlex
import os#获取当前文件路径
parentpath = os.getcwd()
print("parentpath " + parentpath)
#获取所有group,其中private_token就是access_token
allgroups = urlopen("http://192.168.30.151:80/api/v4/groups?private_token=xQxdakxYNxxxxxxx")
allgroupsDict = json.loads(allgroups.read().decode())
for thisgroup in allgroupsDict:try:#切换到父目录os.chdir(parentpath)thisGroupFullPath = thisgroup['full_path']thisGroupId = thisgroup['id']print("group full path %s, groupId,%s" % (thisGroupFullPath,thisGroupId))#这里我只clone YM801这个group下的仓库if "YM801" in thisGroupFullPath:isExists = os.path.exists(parentpath+"/"+thisGroupFullPath)if not isExists:os.makedirs(parentpath+"/"+thisGroupFullPath)#保持文件目录与远程仓库一直,并切换到目录os.chdir(parentpath+"/"+thisGroupFullPath)#获取当前group下的所有仓库projects = urlopen("http://192.168.30.151:80/api/v4/groups/"+str(thisGroupId)+"/projects?private_token=xQxdakxYNxxxxxxx")projectsDict = json.loads(projects.read().decode())for thisProject in projectsDict:try:#因为我本地git clone 配置的是http格式的,所以我选择了http_url_to_repo, 如果你是用的git@格式,你就选择ssh_url_to_repothisProjectURL = thisProject['http_url_to_repo']command = shlex.split('git clone %s' % thisProjectURL)reresultCode = subprocess.Popen(command)print("project url %s" % (thisProjectURL))except Exception as e:print("Error on %s:%s" % (thisProjectURL,e.strerror))except Exception as e:print("Error on %s:%s" % (thisGroupFullPath,e.strerror))

运行以上脚本完美解决我的需求。

总结

以上就是我的处理方案,如有不妥之处,欢迎留言讨论

git clone 整个 group相关推荐

  1. git init和git clone获取仓库 (一)

    文章目录 使用git init和git clone获取git仓库 1 git init 在本地目录上创建Git仓库 2 git clone 从已有的Git存储数据库中克隆仓库到本地目录 3 导航页 使 ...

  2. git clone 多个_搭建自己的 Git 服务器

    根据 RhodeCode[1] 在 2016 年做过的一项分析报告 Version Control Systems Popularity in 2016[2],在如今的 VCS(版本控制系统)领域,G ...

  3. Git 常用操作(5)- git clone/git checkout -b/git diff/git push/git pull

    1. git clone--获取远程仓库 当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容.它只会获取数据然后 让你自己合并. 然而,有一个命令叫作 git p ...

  4. 【Git】git clone时下载速度太慢的解决方法(亲测有效)

    1.参考博客 https://www.jianshu.com/p/3f6477049ece 2.原因 git clone特别慢是因为github.global.ssl.fastly.net域名被限制了 ...

  5. 解决Ubuntu系统下git clone下载速度较慢的问题(亲测有效)

    常见问题使用Git clone下载网速通常有十几kb,下载较慢. 使用以下指令即可解决: //这是我们要clone的,通常是github.com需要替换掉,就是在github.com后面加上.cnpm ...

  6. Git clone密码输入错误如何修改

    一步教你解决git clone密码错误需要修改的问题 当git clone时候,第一次会让你输入用户名和密码,如果密码输错的话,之后执行git clone则会直接报错. 报错提示为:fatal: Au ...

  7. AWS计算云上下载代码命令 git clone url

    AWS计算云上下载代码命令 git clone url https://blog.csdn.net/qq_42672770/article/details/81317778

  8. git clone的时候报error: RPC failed; result=18错误

    因业务需求,需要把内网gitlab仓库的地址对外网访问,在gitlab前端配置了一个nginx代理服务器,来实现需求,可以在git clone的时候报error: RPC failed错误 [root ...

  9. gitlab 无法git clone 的一个小点

    我这个情况不知道是否通病: 因为我本身在服务器上安装了一个 apache2的网页服务器 所以ip地址就是本机的ip地址 但是我和gitlab的端口区分开了 所以我后来发现无法git clone 下来 ...

最新文章

  1. python 数字格式化
  2. vue 导入excel解析_【Vue 笔记】Vue 读取excel数据并生成数组
  3. 小程序执行运行过程原理_PLC的基础小知识!不用把PLC想的太难
  4. Linux 系统应用编程——网络编程(常用命令解析)
  5. 原型化系统---失物招领APP
  6. 485串口测试工具软件_探索者 STM32F407 开发板资料连载第三十一章 485 实验
  7. Merry Christmas
  8. Dos下的edit命令
  9. 纯C语言编程实现数独解法
  10. CVPR2021:单目标跟踪
  11. 2022.11.15 英语背诵
  12. 怎么去视频水印?一键去除视频水印
  13. HTML网页黑白滤镜
  14. Leetcode838: 推多米诺(medium)
  15. hta 北京自动挂号器
  16. Dijkstra算法正确性证明
  17. es6利用Reflect实现观察者模式,并详解Reflect对象
  18. java程序设计实用教程第4版_Java程序设计实用教程(第4版)
  19. 编程序也得劳逸结合,不能太累。。。
  20. PowerBuilder9 学习笔记

热门文章

  1. 升级IOS10 出现的兼容性的问题
  2. 那些年,我们用过的地图下载器
  3. word的小方框如何在里面打上对勾
  4. [YOLOv7/YOLOv5系列算法改进NO.21]CNN+Transformer——主干网络替换为又快又强的轻量化主干EfficientFormer
  5. linux .net 控制台应用程序,使用 Visual Studio Code 创建 .NET 控制台应用程序 - .NET | Microsoft Docs...
  6. 【FFMpeg 命令行】基本应用
  7. 技能Get·PC及手机微信聊天记录的备份与还原
  8. Noisy Channel Language Model Prompting for Few-Shot Text Classification
  9. 个别化教育计划IEP模板
  10. 此计算机上无法找到autocad2017,主编操作win7系统安装autocad2017提示“无法定位inf文件ACAD.inf”的具体步骤...