Git仓库如何优雅的进行备份
一:前言
在日常的工作学习中,Git扮演着越来越重要的角色,渐渐的在版本管理软件中占据C位。我们已经很习惯的将代码托管于Git服务,在我们的潜意识中,当执行git push完成后,一切都完美了。代码也不会丢,还能按照不同的版本找回来,完全没有后顾之忧。
事实上也确是这样,对于Git仓库的备份有人认为很重要,有人认为完全没有必要,对于这个疑问,仁者见仁,智者见智。但我总觉得还是有备无患,所以有了这篇文章。
二:思路
简单来说,Git的备份其实就是对于文件增量的备份,注意,我说的是增量。当然,你也可以进行全量覆盖备份,不过我认为那没有必要。
在进行讲解之前,我们需要了解一个名词webhook
webhooks是一个api概念,是微服务api的使用范式之一,也被成为反向api,即:前端不主动发送请求,完全由后端推送。简单来说,WebHook就是一个接收HTTP POST(或GET,PUT,DELETE)的URL。一个实现了WebHook的API提供商就是在当事件发生的时候会向这个配置好的URL发送一条信息。与请求-响应式不同,使用WebHooks,你可以实时接受到变化。
所以,我的Git备份使用了webhook。简单来说就是在已存在的Git仓库中找到webhook的配置,配置一个接收推送的地址,然后当用户进行操作的时候,webhook会接收到本次操作并根据地址进行推送,然后使用一个项目处理接收到的数据,调用脚本进行git仓库的拉取即可。
流程大致如图:
三:实现
1.使用Github为例,github的webhook配置位置如下:
Payload URL就是我们配置接收推送的地址,地址可以等下面步骤完成后再进行配置。
2.新建Springboot项目,用于接收推送信息。完整的示例代码可以访问地址:https://github.com/tomorrowWithYou/git-backup.git 项目中包含windows和linux的脚本,简单修改执行脚本路径后可直接使用。代码为了便于阅读和使用,两种方式我直接分开写的,大家可以参考一下。
下面附上部分代码:
@PostMapping("/backupUnderLinuxReceive")public String receive(HttpServletRequest request, HttpServletResponse response) throws IOException, InterruptedException {log.info("请求对象:{}", request);// 1.得到请求的所有对象String body = readAsChars(request);log.info("完整的参数:{}", body);// 2.取出关键参数JSONObject jsonObject = JSONObject.parseObject(body);JSONObject repository = jsonObject.getJSONObject("repository");// 得到ssh地址,需要使用ssh地址,不能使用https,因为https需要密码,ssh免密String sshUrl = repository.getString("ssh_url");// 仓库名称String name = repository.getString("name");// 3.调用sh脚本拉取代码execShell(name, sshUrl);return "";}
private void execShell(String name, String url) throws IOException, InterruptedException {String bashCommand = "/bin/sh " + shellDir + " " + workspace + " " + name + " " + url;log.info("执行sh脚本命令:{}", bashCommand);Runtime runtime = Runtime.getRuntime();Process pro = runtime.exec(bashCommand);int status = pro.waitFor();if (status != 0) {log.info("Failed to call shell's command ");}BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream()));StringBuffer strbr = new StringBuffer();String line;while ((line = br.readLine()) != null) {strbr.append(line).append("\n");}String result = strbr.toString();log.info("执行完成:{}", result);}
3.将clone的代码修改完成后,部署到相应的机器上。java环境配置这里就不再涉及,git也需要安装,因为要执行脚本和生成密钥。将生成好的密钥配置到Github中,配置地址如下图:
4.将部署项目接收推送的地址配置在第一步中,然后本地push代码到github上,即可触发webhooks。最后即可看见代码已经被更新下来了。尝试进行多次修改推送,脚本也同样会按照git的命令进行更新。
5.至此,一个完整的git实时备份功能就完成了。
四:扩展以及注意事项
代码中提供了shell和bat两种脚本以及对应的部署方式。windows可以参考第三步的实现进行操作。
接收推送发现代码没有被clone,可以先确认是否拥有权限,ssh配置是否正确。
由于git服务的实现比较多,比如github和aliyun的codeup进行推送时的数据结构也可能会存在差异,所以代码中需要按需进行修改。具体的数据结构可以如下图所示进行查看,在webhooks下方
结尾了,大家有什么疑问,可以在下方评论哟
Git仓库如何优雅的进行备份相关推荐
- 【Git、GitHub、GitLab】十 将git仓库备份到本地
上一篇文章学习记录了工作中常用的一些git命令,点击链接查看:[Git.GitHub.GitLab]九 工作中非常重要的一些git用法 文章目录 1 git的传输协议 2 如何将git仓库备份到本地 ...
- Git : 将本地git仓库同步到远端github上
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...
- 阿捷外传之Git代码统计:DotNetCore + PowerBI 实现Git仓库日志分析
前言 2020年3月初春,虽然春节已经过去一个多月,大街上还未恢复往年的热闹.由于春节前夕突然降临的冠状病毒,导致很多员工无法回到城市复工.春节之后,阿捷所在的公司考虑到复工带来的风险,通知所有员工以 ...
- Docker上部署GitLab , 搭建私有Git仓库 (基于Docker镜像sameersbn/docker-gitlab)
# 使用docker-compose.yml 安装gitlab服务器 $ wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/ ...
- 如何将硕大笨重的git仓库拆分成灵活轻巧的模块小仓库
方法1.拆分一个子目录为独立仓库 参考链接:https://segmentfault.com/a/1190000002548731 以前是用 filter-branch 来实现,这个需求太常见了,有人 ...
- git仓库详细了解 一
这两天将git详细的了解了一波,特此分享笔记····· git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理: 集中式.分布式: 集中式:就像是一个仓库,将所有的东西 ...
- 在自己的服务器上搭建git仓库服务器(本地推送到远程仓库、远程仓库推送到本地)
文章目录 Git服务器 一.安装Git 二.配置Git 1.创建Git用户 2.仓库初始化 三.使用仓库 1.本地推送到远程仓库 2.远程仓库推送到本地 总结 Git服务器 一般,我们编写项目,都会保 ...
- git仓库的基本使用
首发自:本然道软件:git仓库的基本使用 前言 在软件研发的过程中,我们如何将自己的代码管理起来,其实是一个很重要的话题.这里的管理往往包含了这样几个方面: 如何共享代码?我们一般不是一个人在研发,即 ...
- Git仓库建立与连接远程仓库
Git仓库建立与连接远程仓库 1.前期准备 (1)需要软件:git-bash (2)创建一个文件夹或选择需要建立git仓库的文件夹(如果本地文件夹中,有文件,建议复制出去一个备份,防止自己操作失误,导 ...
最新文章
- [Linux] ubuntu 格式化u盘
- leetcode位运算的题
- python实现gauss-seidel迭代公式_python实现高斯(Gauss)迭代法的例子
- .NET系统学习----Globalization Resources
- web前端攻城狮整理的收藏夹
- JVM 的内存结构和内存分配
- 网易马进:DDB从分布式数据库到结构化数据中心的架构变迁
- Kotlin学习笔记28 Flow part2 Flow引入 Flow的执行 取消 构建器 中间操作符 终端操作符 默认执行顺序 上下文相关
- freemarker处理EL表达式
- Ajax提交与传统表单提交的区别说明
- paip.论程序断点的类型以及设置总结
- ppt如何替换其他mo ban_如何制作PPT教程:PPT排版格式技巧汇总
- linux终端怎么设置monaco,[Linux]Vim设置Monaco字体Vim颜色模板
- ArcGIS 拓扑验证与编辑共享要素
- 【庄碰辉】物质与精神的对垒中选择
- [PS] 透明底图片制作
- 学习笔记(12):A110测试-测试课程申请22
- 展锐T618/T610安卓4G核心板/开发板/方案定制
- 【中文】【吴恩达课后编程作业】Course 4 - 卷积神经网络 - 第二周作业
- 【黑马课程笔记】webAPI