一:前言

在日常的工作学习中,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仓库如何优雅的进行备份相关推荐

  1. 【Git、GitHub、GitLab】十 将git仓库备份到本地

    上一篇文章学习记录了工作中常用的一些git命令,点击链接查看:[Git.GitHub.GitLab]九 工作中非常重要的一些git用法 文章目录 1 git的传输协议 2 如何将git仓库备份到本地 ...

  2. Git : 将本地git仓库同步到远端github上

    现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...

  3. 阿捷外传之Git代码统计:DotNetCore + PowerBI 实现Git仓库日志分析

    前言 2020年3月初春,虽然春节已经过去一个多月,大街上还未恢复往年的热闹.由于春节前夕突然降临的冠状病毒,导致很多员工无法回到城市复工.春节之后,阿捷所在的公司考虑到复工带来的风险,通知所有员工以 ...

  4. Docker上部署GitLab , 搭建私有Git仓库 (基于Docker镜像sameersbn/docker-gitlab)

    # 使用docker-compose.yml 安装gitlab服务器 $ wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/ ...

  5. 如何将硕大笨重的git仓库拆分成灵活轻巧的模块小仓库

    方法1.拆分一个子目录为独立仓库 参考链接:https://segmentfault.com/a/1190000002548731 以前是用 filter-branch 来实现,这个需求太常见了,有人 ...

  6. git仓库详细了解 一

    这两天将git详细的了解了一波,特此分享笔记····· git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理: 集中式.分布式: 集中式:就像是一个仓库,将所有的东西 ...

  7. 在自己的服务器上搭建git仓库服务器(本地推送到远程仓库、远程仓库推送到本地)

    文章目录 Git服务器 一.安装Git 二.配置Git 1.创建Git用户 2.仓库初始化 三.使用仓库 1.本地推送到远程仓库 2.远程仓库推送到本地 总结 Git服务器 一般,我们编写项目,都会保 ...

  8. git仓库的基本使用

    首发自:本然道软件:git仓库的基本使用 前言 在软件研发的过程中,我们如何将自己的代码管理起来,其实是一个很重要的话题.这里的管理往往包含了这样几个方面: 如何共享代码?我们一般不是一个人在研发,即 ...

  9. Git仓库建立与连接远程仓库

    Git仓库建立与连接远程仓库 1.前期准备 (1)需要软件:git-bash (2)创建一个文件夹或选择需要建立git仓库的文件夹(如果本地文件夹中,有文件,建议复制出去一个备份,防止自己操作失误,导 ...

最新文章

  1. [Linux] ubuntu 格式化u盘
  2. leetcode位运算的题
  3. python实现gauss-seidel迭代公式_python实现高斯(Gauss)迭代法的例子
  4. .NET系统学习----Globalization Resources
  5. web前端攻城狮整理的收藏夹
  6. JVM 的内存结构和内存分配
  7. 网易马进:DDB从分布式数据库到结构化数据中心的架构变迁
  8. Kotlin学习笔记28 Flow part2 Flow引入 Flow的执行 取消 构建器 中间操作符 终端操作符 默认执行顺序 上下文相关
  9. freemarker处理EL表达式
  10. Ajax提交与传统表单提交的区别说明
  11. paip.论程序断点的类型以及设置总结
  12. ppt如何替换其他mo ban_如何制作PPT教程:PPT排版格式技巧汇总
  13. linux终端怎么设置monaco,[Linux]Vim设置Monaco字体Vim颜色模板
  14. ArcGIS 拓扑验证与编辑共享要素
  15. 【庄碰辉】物质与精神的对垒中选择
  16. [PS] 透明底图片制作
  17. 学习笔记(12):A110测试-测试课程申请22
  18. 展锐T618/T610安卓4G核心板/开发板/方案定制
  19. 【中文】【吴恩达课后编程作业】Course 4 - 卷积神经网络 - 第二周作业
  20. 【黑马课程笔记】webAPI

热门文章

  1. 给定三边判断是否是直角三角形
  2. Oracle Audit Vault部署
  3. 毕业论文中的“参考文献”设置(经验二)
  4. >>数据管理:引序和目录
  5. Linux mount挂载命令
  6. 快速了解历史Android操作系统版本(开发学习攻略)
  7. Few-shots object detection
  8. 计算机主板损坏,电脑主板损坏原因
  9. 产生瑞利分布的随机数 C语言实现
  10. 6810. 【2020.10.05提高组模拟】路哥