gitlab仓库API操作

几年没接触gitlab了,新版本装完以后代码提交到默认的main分支,master不再是主分支
项目有几十个仓库,研发提交代码后仓库地址和之前的发生了变化

先修改Group的默认分支,不会影响已存在的项目在这里插入图片描述
修改gitlab全局的默认分支
在这里插入图片描述

这就引出了需求,要获取当前仓库下所有仓库地址,还要修改所有仓库的默认分支,从main修改为master

生成AccessToken在这里插入图片描述

创建个人访问令牌

填写信息时,确保勾选以下权限(Scopes):
api
read_api
read_repository
write_repository
admin_mode(如果是要批量修改默认分支,可能需要这个权限)
# 权限解析
api 和 read_api: 基本的 API 访问权限
read_repository: 读取仓库信息
write_repository: 修改仓库设置(包括默认分支)
admin_mode: 管理员级别的操作权限

需求1-获取仓库下所有项目地址

import requests
import sys
import time
from typing import List, Dict

class GitLabProjectFetcher:
    def __init__(self, base_url: str, private_token: str):
        """
        初始化 GitLab API 客户端
        
        Args:
            base_url: GitLab 实例的基础 URL
            private_token: GitLab 个人访问令牌
        """
        self.base_url = base_url.rstrip('/')
        self.headers = {'PRIVATE-TOKEN': private_token}
        self.session = requests.Session()
        self.session.headers.update(self.headers)

    def get_all_projects(self) -> List[Dict]:
        """获取所有项目"""
        projects = []
        page = 1
        while True:
            url = f"{self.base_url}/api/v4/projects"
            params = {
                'page': page,
                'per_page': 100,
                'order_by': 'path',
                'sort': 'asc'
            }
            
            try:
                response = self.session.get(url, params=params)
                response.raise_for_status()
                
                batch = response.json()
                if not batch:
                    break
                    
                projects.extend(batch)
                page += 1
                print(f"已获取 {len(projects)} 个项目...")
                
                time.sleep(0.5)  # 避免请求过快
                
            except requests.exceptions.RequestException as e:
                print(f"获取项目列表时发生错误: {str(e)}")
                sys.exit(1)
            
        return projects

def main():
    # 配置信息 - 根据实际环境修改
    GITLAB_URL = "http://gitlab地址"
    PRIVATE_TOKEN = "accesstoken"
    
    fetcher = GitLabProjectFetcher(GITLAB_URL, PRIVATE_TOKEN)
    
    try:
        print("正在获取项目列表...")
        projects = fetcher.get_all_projects()
        
        print("\n所有项目的 Git SSH Clone URL:")
        print("-" * 80)
        
        # 按照路径排序
        sorted_projects = sorted(projects, key=lambda x: x['path_with_namespace'])
        
        for project in sorted_projects:
            if 'ssh_url_to_repo' in project:
                print(project['ssh_url_to_repo'])
        
        print(f"\n总共找到 {len(projects)} 个项目")
        
    except Exception as e:
        print(f"发生错误: {str(e)}")
        sys.exit(1)

if __name__ == "__main__":
    main()

需求2-修改所有仓库默认的分支为master

root@prd-ops-cicd-jenkins33:/data/ops# cat chage-branch.py 
import requests
import sys
import time
from typing import List, Dict

class GitLabProjectManager:
    def __init__(self, base_url: str, private_token: str):
        """
        初始化 GitLab API 客户端
        """
        self.base_url = base_url.rstrip('/')
        self.headers = {'PRIVATE-TOKEN': private_token}
        self.session = requests.Session()
        self.session.headers.update(self.headers)

    def get_all_projects(self) -> List[Dict]:
        """获取所有项目"""
        projects = []
        page = 1
        while True:
            url = f"{self.base_url}/api/v4/projects"
            params = {
                'page': page,
                'per_page': 100,
                'order_by': 'path',
                'sort': 'asc',
                'simple': False
            }
            
            try:
                print(f"正在获取第 {page} 页...")
                response = self.session.get(url, params=params)
                response.raise_for_status()
                
                batch = response.json()
                if not batch:
                    break
                    
                projects.extend(batch)
                page += 1
                time.sleep(0.5)
                
            except requests.exceptions.RequestException as e:
                print(f"获取项目列表时发生错误: {str(e)}")
                sys.exit(1)
            
        return projects

    def check_branch_exists(self, project_id: int, branch: str) -> bool:
        """检查分支是否存在"""
        url = f"{self.base_url}/api/v4/projects/{project_id}/repository/branches/{branch}"
        response = self.session.get(url)
        return response.status_code == 200

    def update_default_branch(self, project_id: int, project_name: str, new_branch: str) -> bool:
        """更新项目的默认分支"""
        # 检查目标分支是否存在
        if not self.check_branch_exists(project_id, new_branch):
            print(f"项目 {project_name} 中不存在 {new_branch} 分支,跳过")
            return False

        url = f"{self.base_url}/api/v4/projects/{project_id}"
        data = {'default_branch': new_branch}
        
        try:
            response = self.session.put(url, json=data)
            response.raise_for_status()
            return True
        except requests.exceptions.RequestException as e:
            print(f"更新失败: {str(e)}")
            return False

def main():
    # 配置信息
    GITLAB_URL = "http://gitlab地址"
    PRIVATE_TOKEN = "accesstoken"
    NEW_DEFAULT_BRANCH = "master"
    
    manager = GitLabProjectManager(GITLAB_URL, PRIVATE_TOKEN)
    
    try:
        # 获取所有项目
        print("正在获取项目列表...")
        projects = manager.get_all_projects()
        print(f"\n找到 {len(projects)} 个项目")
        
        # 更新默认分支
        success_count = 0
        fail_count = 0
        skipped_count = 0
        
        print("\n开始更新默认分支...")
        for project in projects:
            project_id = project['id']
            project_name = project['path_with_namespace']
            current_default = project.get('default_branch', '')
            
            print(f"\n处理项目: {project_name}")
            print(f"当前默认分支: {current_default}")
            
            if current_default == NEW_DEFAULT_BRANCH:
                print("默认分支已经是 master,跳过")
                skipped_count += 1
                continue
                
            if manager.update_default_branch(project_id, project_name, NEW_DEFAULT_BRANCH):
                success_count += 1
                print(f"✓ 成功将默认分支更新为 {NEW_DEFAULT_BRANCH}")
            else:
                fail_count += 1
                print(f"✗ 更新失败")
        
        # 打印总结
        print("\n更新完成!")
        print(f"成功更新: {success_count} 个项目")
        print(f"更新失败: {fail_count} 个项目")
        print(f"跳过项目: {skipped_count} 个项目")
        print(f"总项目数: {len(projects)} 个项目")
        
    except Exception as e:
        print(f"发生错误: {str(e)}")
        sys.exit(1)

if __name__ == "__main__":
    main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938159.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Gitlab服务管理和仓库项目权限管理

Gitlab服务管理 gitlab-ctl start # 启动所有 gitlab 组件; gitlab-ctl stop # 停止所有 gitlab 组件; gitlab-ctl restart # 重启所有 gitlab 组件; gitlab-ctl status …

睡岗和玩手机数据集,4653张原始图,支持YOLO,VOC XML,COCO JSON格式的标注

睡岗和玩手机数据集,4653张原始图,支持YOLO,VOC XML,COCO JSON格式的标注 数据集分割 训练组70% 3257图片 有效集20% 931图片 测试集10% 465图片 预处理 没有采用任何预处…

vue响应式数据-修改对象的属性值,视图不更新

如图: 一:问题是: 我把数据处理后能console.log()打印出来,但是页面的内容不能同步的更新渲染; 二:要求: 在数组循环列表里面,我点击单个的item按钮时,需要实时加载进度…

HuLa——一款基于 Tauri+Vue3 构建的桌面即时通讯应用

文章目录 一、HuLa简介二、技术栈介绍三、安装运行四、界面体验五、开源地址 一、HuLa简介 HuLa 是一个基于 Tauri、Vite 5、Vue 3 和 TypeScript 构建的即时通讯系统。它利用了 Tauri 的跨平台能力和 Vue 3 的响应式设计,结合了 TypeScript 的类型安全特性和 Vite…

云计算HCIP-OpenStack03

书接上回: 云计算HCIP-OpenStack02-CSDN博客 10.KeyStone keystone-Openstack,IAM服务(统一身份认证)-云服务 建议先去了解Hadoop(大数据生态系统)中的kerberos(LDAPkerberos的鉴权机制&#xf…

【YOLO 项目实战】(10)YOLO8 环境配置与推理检测

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【YOLO 项目实战】(1)YOLO5 环境配置与检测 【YOLO 项目实战】(10)YOLO8 环境配置与推理检测 【YOLO5 项目实战】(10)YOLO8 环境…

Vue 3: 通过图片链接获取图片颜色,间接设置背景颜色

在现代Web开发中,动态获取和处理图像数据是一个常见的需求。例如,你可能希望自动提取一张图片的主色调,以便根据这些颜色进行UI主题调整或其他视觉效果的处理。本文将介绍如何在Vue 3项目中,通过一个图片链接获取图片的颜色信息。…

请确保 $(OutDir)、$(TargetName) 和 $(TargetExt) 属性值与 %(Link.OutputFile) 中指定的值匹配

vs版本升级时,编译时会出现上述问题,如原来在2017下编译的程序,后来改用2019,出现上述问题。需要在解决方案-通用属性-调试源文件下变更相应设置。

FFmpeg第一话:FFmpeg 简介与环境搭建

FFmpeg 探索之旅 一、FFmpeg 简介与环境搭建 二、FFmpeg 解码详解 第一话:FFmpeg 简介与环境搭建 FFmpeg 探索之旅一、前言二、FFmpeg 是什么?三、简单介绍其历史背景四、为什么用 C学习 FFmpeg?(一)高性能优势&#…

【功能安全】软件安全架构

目录 01 软件安全架构介绍 02 软件架构设计模板 03 软件架构设计示例 01 软件安全架构介绍

OpenLinkSaas 2025年1月开发计划

先来看看OpenLinkSaas的大目标 在OpenLinkSaas的产品目标中,让开发人员更加方便的使用云资源是目标之一。通过各大云厂商的API,来可视化云上基础设施的数据是远远不够的。我们准备在2025年1月份增加方便管理和运营研发场景下服务器的能力。 这部分的功能…

【Verilog】实验九 存储器设计与IP调用

一、实验目的 1. 掌握单端口RAM和ROM原理和设计方法。 2. 掌握单端口RAM和ROM的IP生成和调用方法。 2. 掌握ModelSim和VIVADO工具软件。 3. 掌握基本的测试代码编写和FPGA开发板使用方法。 二、实验环境 1. 装有ModelSim和VIVADO的计算机。 2. Sword实验系统。 三、实验…

元力音乐 1.2.2 | 完全免费无广告的无损音乐听歌下载工具

元力音乐是一款音乐听歌和下载工具,提供完全免费且没有任何广告弹窗的用户体验。内置两条线路,用户可以无限次下载无损音质音乐。作者承诺永久免费并长期维护此应用。此外,它还支持导入歌单功能,让用户能够轻松管理和下载喜爱的音…

生产环境迁移——harbor篇

这些年环境迁移干了很多,但是没有总结,想想还是记录一下,以前是下属做,自己统筹就行,现在就剩下孤家寡人了,只好都自己做。还是完整记录下来,供有缘人参考。其实我也是搭了个草台班子。 1 安装…

电脑问题4[非华为电脑安装华为电脑管家华为荣耀手机多屏协助]

非华为电脑安装华为电脑管家华为荣耀手机多屏协助 我是荣耀手机之前一直用的是window的"连接手机"功能,电脑控制手机还蛮好用,但是又不能够没有好的电脑控制手机的功能,后来想了想看了看,竟然安装了华为电脑关键,竟然可以顺利连接上荣耀手机,发现还蛮好用! 本文引用…

KeyFormer:使用注意力分数压缩KV缓存

Keyformer: KV Cache Reduction through Key Tokens Selection for Efficient Generative Inference 202403,发表在Mlsys Introduction 优化KV cache的策略,主要是集中在系统级别的优化上,比如FlashAttention、PagedAttention,它…

linux ibus rime 中文输入法,快速设置为:默认简体 (****)

本文环境: ubuntu 22.04 直接 apt install ibus-rime 输入法的安全性,人们应该关注吧!!?? 云输入法?将用户的输入信息传输到云端吗? Rime 等的一些输入法,是本地的&…

【python从入门到精通】-- 第七战:字典

🌈 个人主页:白子寰 🔥 分类专栏:重生之我在学Linux,C打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~ 💡 坚持…

海外本地化呼叫中心有哪些独特优势?

随着全球化的深入推进,企业越来越注重拓展海外市场,而海外本地化呼叫中心作为企业海外拓展的重要工具,其独特优势逐渐凸显。沃丰科技呼叫中心系统凭借其先进的功能和卓越的服务质量,为众多企业提供了完美的解决方案。 语言与文化…

优选算法——分治(归并)

1. 归并排序 题目链接&#xff1a;912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 题目展示&#xff1a; 题目分析&#xff1a;这里我们直接来实现归并排序即可&#xff1b; 代码实现&#xff1a; class Solution {vector<int> tmp;//在全局创建辅助数组&…