Android下的配置管理之道之gerrit自动备份分支ref-protection插件
最近研究了一个gerrit自动备份分支的插件。
Ref protection 直译过来就是 引用保护.也就是保护 git下面 refs 的一个插件
1 | Ref protection plugin. |
根据说明 是当在gerrit上删除分支/或者采用了 git 强制push的时候,会触发这个备份分支的动作。
在使用过程中发现,git 强制push的时候会报如下的错误。通过分析发现是 git push的这个账号没有
在 refs/backups/* 下面有 create refs 的权限。加上这个权限就不会报错了。
不过总觉得这个不合理。你管我怎么操作的,你都要给我备份了就行了。
1 |
|
下面这个是在gerrit上删除分支 触发的 打印的日志。
1 | [2019-12-31 16:21:26,179] [HTTP-71] INFO com.googlesource.gerrit.plugins.refprotection.RefUpdateListener : Ref Deleted: project [git/shared/tools/blog] refname [refs/heads/test4] old object id [5130c6f4d1dd84a9eae13eca14e627db50f843bd] |
下面准备通过源码来 跟踪一下执行过程,看看为啥会有这个区别。或者为啥会有这个报错。
准备工作
1 | gerrit 2.12.x 版本 |
报错的地方 plugins/ref-protection/src/main/java/com/googlesource/gerrit/plugins/refprotection/BackupRef.java
1 | } else { |
通过打印 RefControl 对象,我们发现两种操作() 时候的 RefControl 对象基本上没啥差异
1 | RefControl{ |
下面是在gerrit上操作删除分支的日志
1 | [2020-01-09 18:43:32,983] [HTTP-62] INFO com.google.gerrit.server.project.CreateBranch : =========================================== |
下面是 强制 push输出的日志
1 | [2020-01-09 18:44:32,117] [ReceiveCommits-2] INFO com.google.gerrit.server.project.CreateBranch : =========================================== |
继续追踪代码
1 | 通过之前 push时候报错 我追踪到 这里 plugins/ref-protection/src/main/java/com/googlesource/gerrit/plugins/refprotection/BackupRef.java |
继续追踪代码
1 | 继续追踪代码 refControl.canCreate(db.get(), rw, object) 的执行 |
下面就要分析 为什么两种操作 走的 不同的 if else 语句了
1 | 我们在 canCreate() 方法中 继续加上更多的 日志输出 |
继续加日志分析
1 |
|
最终我给出了一个修改放啊,可以参考
https://github.com/mamh-java/plugins_ref-protection/tree/mamh-2.12.7
下面是 修改后 几种操作的日志输出
1 | git push fast forward的操作 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 马哥私房菜!