git仓库批量备份

git的mirror参数

在git中,--mirror是一个用于克隆和推送操作的参数。它用于创建一个镜像仓库,包含了源仓库的所有分支、标签和提交历史记录。

当使用git clone --mirror <source-repo>命令时,会创建一个完全相同的镜像仓库,其中包含源仓库的所有内容。与普通克隆不同,镜像仓库会将所有的分支和标签都设为跟踪远程仓库的分支和标签。这意味着可以使用镜像仓库进行完整的版本控制操作,包括查看历史记录、切换分支等。

对于已经clone下载的仓库,如果远程仓库更新了,则可以用git fetch --prune对本地仓库保持同步。当执行该命令时,git会从远程仓库获取最新的提交和分支信息,并将这些更新同步到本地仓库的远程跟踪分支中。同时,它还会检查本地的远程跟踪分支,如果在远程仓库中已经删除了某个分支,那么它也会将这个本地的远程跟踪分支删除。

当在镜像仓库上执行git push --mirror <destination-repo>命令时,将会把镜像仓库的所有内容推送到目标仓库中,包括分支、标签和提交历史记录。

利用这些特性我们就可以完整备份git仓库。

命令行操作

$ git clone --mirror git@git.example.com/example.git
Cloning into bare repository 'example.git'...
remote: Enumerating objects: 760, done.
remote: Counting objects: 100% (760/760), done.
remote: Compressing objects: 100% (438/438), done.
remote: Total 760 (delta 280), reused 759 (delta 279)
Receiving objects: 100% (760/760), 4.79 MiB | 9.97 MiB/s, done.
Resolving deltas: 100% (280/280), done.
$ cd example.git/
$ tree -L 1
.
├── branches
├── config
├── description
├── HEAD
├── hooks
├── info
├── objects
├── packed-refs
└── refs5 directories, 4 files

需要使用ssh或者git地址,不要使用http地址,并把ssh public key传输到git服务器上,避免clone的时候需要输入密码。对于单个仓库,手动执行足够了,但对于批量仓库操作需要封装成api待用。

python示例代码

import os
import sys
import timeclass GitMirror():def __init__(self):pass@staticmethoddef os_system(cmd):print("execute command [%s]" % cmd)os.system(cmd)@staticmethoddef mirror_fetch(local_path, remote_path):local_git_path = local_path + ".git"parent_path = os.path.dirname(local_git_path)# not first runif os.path.exists(local_git_path):print("enter [%s] and fetch" % (local_git_path))GitMirror.os_system("git --git-dir=%s fetch --prune" % local_git_path)else:  # first run, git cloneprint("git clone mirror from [%s] " % (remote_path))GitMirror.os_system("mkdir -p %s; cd %s; git clone --mirror %s" % (parent_path, parent_path, remote_path))time.sleep(0.2)if __name__ == "__main__":GitMirror.mirror_fetch("/home/dev/backup/example", "git@git.example.com/example.git")

批量获取仓库地址

gitlab, github, gitee,gerrit等git托管服务都提供了REST api,可以通过这些api批量获取仓库信息。以gitlab为例(https://docs.gitlab.com/ee/api/rest/ )

一 获取Access Tokens

首先需要获取Acess Tokens, 在gitlab用户管理界面中找到 “Access Tokens” 标签,输入token名字,勾选 "api"生成token。注意,生成token后务必保存下来,因为后面就再也看不到了,如果没存下来,只能重新生成。
在这里插入图片描述

二 通过api获取全部projects

通过curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects"可以获取本人以及本人可见的项目(Projects API | GitLab)。

把curl命令转换成python。

在获取全部项目的时候,每次只能返回1页的项目,所以想要获取全部项目,需要分页获取。

返回的项目信息中,有一个非常重要的字段"ssh_url_to_repo",有了项目地址就可以进行完整备份了。

import requestsclass GitlabApi():def __init__(self, token, url):self.token = tokenself.url = "%s%s" %(url, "api/v4/")self.header = {"Content-Type": "application/json","Private-Token": self.token}def get_all_projects(self):data = []page = 0total_pages = 1while page < total_pages:api_url = "%s%s%s" % (self.url, "projects", "?page=%d" % page)res = requests.get(api_url, headers = self.header)total_pages = int(res.headers["X-Total-Pages"])data += res.json()page += 1return dataif __name__ == "__main__":api = GitlabApi("your_token", "http://git.example.com/")res = api.get_all_projects()for i in res:print(i)

三 根据项目信息备份全部仓库

根据服务器的路径,在本地也做一个对应的目录结构。

def signal_handler(signum, frame):sys.exit(0)if __name__ == "__main__":signal.signal(signal.SIGINT, signal_handler)signal.signal(signal.SIGTERM, signal_handler)api = GitlabApi("your_token", "http://git.example.com/")download_path = os.path.join(os.path.abspath(os.getcwd()), "tmp")res = api.get_all_projects()for i in res:path = os.path.join(download_path, i["path_with_namespace"])GitMirror.mirror_fetch(path, i["ssh_url_to_repo"])with open("%s%s.json"%(path, i["name"]), "w") as fout:fout.write(json.dumps(i, indent=4))print("total %d" % len(res))

完整代码

import json
import os.path
import sys
import signal
import time
import requestsclass GitlabApi():def __init__(self, token, url):self.token = tokenself.url = "%s%s" %(url, "api/v4/")self.header = {"Content-Type": "application/json","Private-Token": self.token}def get_all_projects(self):data = []page = 0total_pages = 1while page < total_pages:api_url = "%s%s%s" % (self.url, "projects", "?page=%d" % page)res = requests.get(api_url, headers = self.header)total_pages = int(res.headers["X-Total-Pages"])data += res.json()page += 1return dataclass GitMirror():def __init__(self):pass@staticmethoddef os_system(cmd):print("execute command [%s]" % cmd)os.system(cmd)@staticmethoddef mirror_fetch(local_path, remote_path):local_git_path = local_path + ".git"parent_path = os.path.dirname(local_git_path)# not first runif os.path.exists(local_git_path):print("enter [%s] and fetch" % (local_git_path))GitMirror.os_system("git --git-dir=%s fetch --prune" % local_git_path)else:  # first run, git cloneprint("git clone mirror from [%s] " % (remote_path))GitMirror.os_system("mkdir -p %s; cd %s; git clone --mirror %s" % (parent_path, parent_path, remote_path))time.sleep(0.2)def signal_handler(signum, frame):sys.exit(0)if __name__ == "__main__":signal.signal(signal.SIGINT, signal_handler)signal.signal(signal.SIGTERM, signal_handler)api = GitlabApi("your_token", "http://git.example.com/")download_path = os.path.join(os.path.abspath(os.getcwd()), "tmp")res = api.get_all_projects()for i in res:path = os.path.join(download_path, i["path_with_namespace"])GitMirror.mirror_fetch(path, i["ssh_url_to_repo"])with open("%s%s.json"%(path, i["name"]), "w") as fout:fout.write(json.dumps(i, indent=4))print("total %d" % len(res))

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS学习笔记11——ROS中的重名问题

一、ros功能包重名——ros工作空间覆盖 功能包重名时&#xff0c;会按照 ROS_PACKAGE_PATH 查找&#xff0c;在前的会优先执行。ROS 会解析 .bashrc 文件&#xff0c;并生成 ROS_PACKAGE_PATH ROS包路径&#xff0c;即调用功能包的顺序&#xff0c;该变量中按照 .bashrc 中配置…

《安富莱嵌入式周报》第331期:单片机实现全功能软件无线电,开源电源EEZ升级主控,ARM 汇编用户指南,UDS统一诊断服务解析,半导体可靠性设计手册

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 目录&#xff1a; 1、单片机实现低配版全功能软件无线电&#xff0c;范围0.5-30 MHz&#xff0c;支持SSB、AM、FM和CW …

websocket 通信协议

websocket是什么 答: 它是一种网络通信协议&#xff0c;是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 意思就是服务器可以主动向客户端推送信息&#xff0c;客户端也可以主动向服务器发送信息 属于服务器推送技术的一种. 为什么需要websocket? 疑问?…

python爬虫demo——爬取历史平均房价

简单爬取历史房价 需求 爬取的网站汇聚数据的城市房价 https://fangjia.gotohui.com/ 功能 选择城市 https://fangjia.gotohui.com/fjdata-3 需要爬取年份的数据&#xff0c;等等 https://fangjia.gotohui.com/years/3/2018/ 使用bs4模块 使用bs4模块快速定义需要爬取的…

安装mmcv-full(包括安装torch以及mmcv的离线安装方式)

文章目录 1. 安装torchtorch的下载链接 安装mmcv-fullmmcv-full的下载链接 在安装mmcv-full中通常需要安装torchmmcv-full。 1. 安装torch 在安装torch的时候&#xff0c;可以根据自身电脑是否有显卡&#xff0c;可以选择安装CPU版本还是GPU版本。mmcv-full也是同理。 安装to…

shell - 正则表达式和grep命令和sed命令

一.正则表达式概述 1.正则表达式定义 1.1 定义 使用字符串描述、匹配一系列符合某个规则的字符串 1.2 了解 普通字符&#xff1a; 大小写字母、数字、标点符号及一些其它符号元字符&#xff1a; 在正则表达式中具有特殊意义的专用字符 1.3 层次分类 基础正则表达式扩展正…

编写交互式 Shell 脚本

在日常的系统管理和自动化任务中&#xff0c;使用 Shell 脚本可以为我们节省大量时间和精力。 文章将以输入 IP 为例&#xff0c;通过几个版本逐步完善一个案例。 原始需求 编写一个交互式的 Shell 脚本&#xff0c;运行时让用户可以输入IP地址&#xff0c;并且脚本会将输入…

css 中 flex 布局最后一行实现左对齐

问题 flex 布局最后一行没有进行左对齐显示&#xff1a; <div classparent><div classchild></div><div classchild></div><div classchild></div><div classchild></div><div classchild></div><div…

Git初识

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 在学习Git之前我们先引入一…

异步任务的一些思考

前言 XXL-Job部署教程 项目中&#xff0c;必然少不了数据的导入导出&#xff0c;针对数据的导入导出简单复盘一下。 为了不占用资源消耗时间&#xff0c;影响用户体验&#xff0c;大量数据的导入导出一般都是异步执行 导入的时候&#xff0c;如果数据量很大&#xff0c;一次…

推荐一款Linux、数据库、Redis、MongoDB统一管理平台!

官方演示 状态查看 ssh 终端 文件操作 数据库操作 sql 编辑器 在线增删改查数据 Redis 操作 Mongo 操作 系统管理 账号管理 角色管理 资源管理 一.安装 1.下载安装包 cd /opt wget https://gitee.com/dromara/mayfly-go/releases/download/v1.7.1/mayfly-go-linux-amd64.zi…

StoryGPT-V——可以生成漫画故事的多模态大模型

前言 目前&#xff0c;大型模型在复杂故事可视化任务方面依然面临着重大挑战。这是因为此类任务需要对框架描述中的代词&#xff08;例如He、她、他们、他们&#xff09;进行解析&#xff0c;即在分辨率和确保跨帧的角色和背景融合方面进行详细解剖。尽管存在这些挑战&#xf…

12.1 关键点提取------Harris原理及代码

一、原理 该原理看了Harris角点检测原理详解-CSDN博客的博文&#xff0c;在这里写一遍是作为笔记&#xff0c;以供后参考。 1.什么是角点 角点就是图片中的一些突变的点&#xff0c;如下图所示。图中的点都是菱角分明的一些凸出来或凹进去的点。 我们可以直观的概括下角点所具…

广东盈致mes系统在注塑行业的应用

广东盈致MES系统在注塑行业的应用主要体现在以下几个方面&#xff1a; 生产计划与调度&#xff1a;盈致MES系统能够根据订单需求和生产计划&#xff0c;自动生成生产任务&#xff0c;并跟踪生产进度&#xff0c;确保按时完成生产任务。通过与注塑机的集成&#xff0c;系统可以自…

Jupyter notebook文件默认存储路径以及更改方法

目录 1、文件默认存储路径怎么查&#xff1f;2、文件默认存储路径怎么改&#xff1f; 转自&#xff1a;https://blog.csdn.net/fengyeer20120/article/details/109483362 初次使用Jupyter Notebook&#xff0c;确实好用啊&#xff01;但安装Anaconda后&#xff0c;打开Jupyter …

【Pg数据库】删除数据库失败,提示有session正在连接

目录 问题现象原因分析处理方法1.断开所有连接2. 查找相关连接数据库的主机信息3. 再次删除 总结 问题现象 Navicat 删除 PostgreSQL 数据库时失败&#xff0c;提示&#xff1a;正在被其他用户访问&#xff08;有session正在连接&#xff09;如何处理&#xff1f; 如下所示&am…

时隔3年 | 微软 | Windows Server 2025 重磅发布

最新功能 以下是微软产品团队正在努力的方向&#xff1a; Windows Server 2025 为所有人提供的热补丁下一代 AD 活动目录和 SMB数据与存储Hyper-V 和人工智能还有更多… Ignite 发布视频 Windows Server 2025 Ignite Video 介绍 Windows Server 2022 正式发布日期是2021年…

openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错

文章目录 openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错210.1 谓词下推引起的查询报错210.1.1 问题现象210.1.2 原因分析210.1.3 处理办法 openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错 210.…

Zerosync:构建基于STARK的Bitcoin证明系统

1. 引言 前序博客&#xff1a; BitcoinSTARK: ZeroSync & Khepri Robin Linus、Tino Steffens、Lukas George 等人成立了一个名为 ZeroSync 协会&#xff08;ZeroSync Association&#xff09;的瑞士非营利组织&#xff0c;该组织将牵头开发比特币证明系统。ZeroSync 于…

uni-app app引入天地图

话不多说咸鱼来了 <template><view><div class"mapBox" style"width: 100%; height: 100vh;background: #ddc0c0;" id"mapId" ></div></view> </template> <script module"test" lang"r…