首页 > 系统相关 >【工具使用】【Shell脚本】【gitlab】下拉所有的仓库代码并指定分支推送给客户仓库

【工具使用】【Shell脚本】【gitlab】下拉所有的仓库代码并指定分支推送给客户仓库

时间:2024-09-15 09:51:13浏览次数:1  
标签:git obj 仓库 gitlab echo Shell 推送 分支

1  前言

这不是项目要结束了么,项目验收要交付源代码,客户在阿里云上买了个云效,需要把我们公司的代码同步上去。

首先云效支持各种导入,比如直接贴上你的 gitlab地址,再加个token 他就会自己同步,但我不能这么做,主要是因为我们公司有的别的项目代码也在一块,只是分支不一样,并且做事情要干精细点负责点。用了哪个分支就只推哪个分支。

那同步一个仓库的代码,大概需要这么几步:

(1)拉代码 git clone xxx地址

(2)切换分支

(3)添加新仓库地址 git remote add new-origin xxxx新仓库地址

(4)推送 git push new-origin 完事

看似简单其实中间还是遇到一些问题,比如:

(1)权限:拉代码要权限 推代码也要权限  这个我们通过 ssh 方式来方便些 先本地生成下 ssh 然后把 key 配置到拉代码仓库的 key里  也在推的新仓库地址里配置上这个 key 这样拉推的权限就解决了

(2)ssh 推送的时候会有个这个 Are you sure you want to continue connecting (yes/no/[fingerprint]? 可以执行这个 set GIT_SSH_COMMAND=ssh -o StrictHostKeyChecking=accept-new

(3)获取全部仓库,这个还是通过 gitlab 的接口去拉,需要 token,但是不知道是不是 gitlab 的问题还是我的问题 总是获取的不全  我是用的这个 api:/api/v4/projects?per_page=9999&simple=true  它是分页的所以加上 per_page 参数,因为输出的信息很多加上 simple=true

(4)过滤仓库,因为并不是所有的都推,所以要筛选过滤一下,这个维护一个数组 要么在数组里的才推 要么在数组里的不推 或者某个名称开头等 看你们选择

(5)分支筛选,分支命名各种不规范要筛选出一些特定的分支,没有特定分支的话,再推一个默认test分支

(6)打扫战场,推送完后续不用的话,配的 key 该删的就删 token不用的话也删掉等

大概能回忆的暂时是这些问题,基本都解决了,就剩 gitlab 获取所有的仓库感觉它返回的就是不全,是真不全,不知道是不是权限不够还是怎么的,明明我能看到的仓库,JSON数据里边就是没有,大家有知道的还望指点下。

另外参考:这是我之前拉仓库的时候写的另一个 【工具使用】【Shell脚本】【gitlab】下拉所有的仓库代码

2  前置

前置的工作主要就是,ssh 的 key 的生成加配置即可。

生成命令:

ssh-keygen -t rsa -b 4096 -C "xxx"

windows 默认的生成位置 c:/用户/名称/.ssh:

然后把 id_rsa.pub 里的密钥复制到拉推仓库,比如 gitlab:

阿里云效的在这里:

另外拉全部仓库的时候,是调用 gitlab 的 HTTP 接口所以也需要一个 Token,在这个页面生成一个即可。

 

好,前置工作基本就这样。

3  脚本

脚本的话,我这里也就直接贴了,都有注释,大家可以试试,需要变化的可能就是前面的四个地址以及后边要推送分支根据你的情况进行更改:

#!/bin/bash

# 要拉取仓库的HTTP地址
GIT_ADDR="https://xxxxxx"
# 要拉区仓库的 TOKEN
GIT_ACCESS_TOKEN="xxxxx"

# 要拉取的仓库的 SSH 前缀
GIT_CLONE_ADDR="ssh://git@xxxxx:23"
# 要推送的仓库 SSH 前缀
GIT_PUSH_ADDR="git@xxxxxxx"

# 获取的json文件名称
JSON_FILE="data.json"

# 获取所有的仓库
echo "download start"
curl -H "PRIVATE-TOKEN:$GIT_ACCESS_TOKEN" -H "Content-Type: application/json" "$GIT_ADDR/api/v4/projects?per_page=9999" > $JSON_FILE

# json解析
objs=$(cat $JSON_FILE | jq '.[].path_with_namespace')

echo "handle start"
for obj in $objs
do 
    # 去掉双引号    
    obj=`echo $obj | sed -e 's/"//g'`
    echo $obj
    
    # 分支计算标识 如果有指定分支 num++ 没有最后就是 0  等于0的话推默认分支 
    num=0
    # 前缀筛选 判断是不是以某个字符串开头的
    if [[ $obj == stock* ]]; then
        # 截取最后的仓库名称 比如 a/b/c 得出 c
        result="${obj##*/}"
        # 打印一下
        echo $result
        
        # 拼接 clone 地址信息
        obj=`echo $GIT_CLONE_ADDR/$obj`
        # 打印完整的地址信息
        echo $obj
        
        # 拉取代码
        git clone $obj
        
        # 进入代码目录
        cd $result
        
        # 添加新的远程仓库
        norigin=`echo $GIT_PUSH_ADDR/$result`
        echo $norigin
        git remote add new-origin $norigin
        
        # 按分支进行筛选推送
        test=$(git branch -a | grep test)
        echo $test
        if [ ${#test} -gt 0 ]; then
            echo "我找到test了"
            ((num++))
            git checkout test
            # 推送
            git push new-origin
        fi
        master=$(git branch -a | grep master)
        echo $master
        if [ ${#master} -gt 0 ]; then
            echo "我找到master了"
            ((num++))
            git checkout master
            # 推送
            git push new-origin
        fi
        dev=$(git branch -a | grep dev)
        echo $dev
        if [ ${#dev} -gt 0 ]; then
            if [ ${#num} -eq 0 ]; then
                echo "我找到dev了"
                git checkout dev
                # 推送
                git push new-origin
            fi
        fi
        # 退出当前仓库路径
        cd ..
        # !!!可以先测试一个  可以的话把 break 去掉即可
        break
    fi
done
echo "handle end"

最后总共 55个仓库代码的推送,代码就不能给大家看了哈:

shell 脚本不经常写就容易忘,有的数组包含、字符串处理什么的都不会写了= =,但是有逻辑的话,先干什么后干什么最终都可以实现,后续空了看看能不能再优化下,加油。

标签:git,obj,仓库,gitlab,echo,Shell,推送,分支
From: https://www.cnblogs.com/kukuxjx/p/18414963

相关文章

  • Linux相关命令及shell命令
    一、链接文件1.1软链接(符号链接)ls-l能看到类型为链接文件的都是软连接软连接类似于windows的快捷方式创建软连接的方式:ln-s被链接的文件文件名要生成的文件名注意:1.我们一般创建软连接时最好使用绝对路径否则一旦相对位置发生变化链接就会失效。2.如果被链......
  • dedecms靶场(四种webshell姿势)
    姿势一:通过文件管理器上传WebShell1.登陆到后台点击【核心】【文件式管理器】【文件上传】将准备好的一句话木马上传2.点击访问成功蚁剑连接姿势二:修改模板文件拿WebShell1.点击【模板】【默认模板管理】【index.htm】【修改】在文件修改中添加一句话木马保存2.......
  • aspcms webshell漏洞复现
    1.【ip】/admin_aspcms/login.asp访问后台,admin123456登录2.点击【扩展功能】【幻灯片设置】点击【保存】开启代理进行抓包3.在抓取的数据包中修改slideTextStatus字段的值为以下代码并进行发包访问影响文件字段值1%25><%25Eval(Request(chr(65)))%25><%25密码是......
  • 从数据仓库到数据飞轮,看传统服务行业的数字化转型进化
    背景:数字经济时代,随着5G,物联网,大数据,云计算,区块链等技术的应用,企业由原来单纯的重视产品为中心,发展到产品本身和产品服务并重,客户服务成为企业运营的生命线,数字经济时代呼唤客户数字化服务转型,重塑数字化服务新体系,数字化服务呈现在线化,平台化,智慧化,透明化等特点。数字......
  • 通过shell脚本一键修改Linux主机名和IP地址脚本
    目录1.前言 2.shell脚本的具体实现以及解析 1.1脚本功能概述1.2脚本结构分析3.致谢1.前言 在复杂的Linux系统管理中,高效准确地进行配置调整是至关重要的任务。当面临需要同时修改主机名和IP地址的情况时,手动操作不仅繁琐易错,还会耗费大量的时间和精力。想象......
  • 在shell中使用github copilot
    brewinstallghghauthloginghextensioninstallgithub/gh-copilot createalias:aliascopilot='ghcopilot';echo'aliascopilot="ghcopilot"'>>~/.zshrc&&source~/.zshrcaliasgcs='ghcopilotsuggest&#......
  • 第158天:安全开发-Python-Socket编程&反弹Shell&分离免杀&端口探针&域名爆破
    前置知识使用socket模块1.导入模块首先,你需要导入Python的socket模块。importsocket2.创建套接字使用socket.socket()函数创建一个新的套接字。这个函数可以接收两个参数:地址族和套接字类型。   地址族(AddressFamily):AF_INET用于IPv4,AF_INET6用于IP......
  • 从数据仓库到数据飞轮:数据技术演进的探索与思考
    引言在当今的数字化浪潮中,数据被视为一种极具价值的资源,类似于传统工业时代的石油,它为企业挖掘出深邃的洞察力,并成为决策过程中不可或缺的基石。随着技术的不断演进,数据管理的策略与架构也经历了显著的变革,从早期的数据仓库模式,逐步迈向集成化的数据中台架构,并朝着更加动态灵活的数......
  • # Docker 私有仓库搭建教程
    Docker私有仓库是用于存储和管理Docker镜像的私有平台,对于企业来说,搭建私有仓库可以提高镜像的安全性和访问速度。本文将介绍几种搭建Docker私有仓库的方法。一、搭建Docker私有仓库的几种方式1.使用Docker官方Registry镜像Docker官方提供了一个用于构建私有镜......
  • powershell@路径处理相关命令@路径拆分@路径解析@路径拼接@路径判断
    文章目录abstract一览表常用的路径处理场景重点路径处理命令1.Split-Path2.Convert-Path3.Join-Path4.Resolve-Path5.Test-Pathrvpavscvpa总结对比powershellprovider@powershell提供程序abstract在PowerShell中,处理路径相关的命令十分丰富,它们可以帮助我们管理、解析......