最近研究了一个gerrit自动备份分支的插件。
Ref protection 直译过来就是 引用保护.也就是保护 git下面 refs 的一个插件
Ref protection plugin.
Protects against commits being lost by creating backups of deleted refs (or non-fast-forward commits) under the refs/backups/ namespace.
Branch deletion protection can be disabled by setting plugin.ref-protection.protectDeleted false in gerrit.config. Similarly, non-fast-forward update protection can be disabled with plugin.ref-protection.protectFastForward false.
Branches under refs/heads/ that are deleted or rewritten are backed up as refs/backups/heads/branch-name-YYYYMMDD-HHmmss by default, or as sequentially increasing numbers under refs/backups/heads/branch-name/# by setting plugin.ref-protection.useTimestamp false.
Tags under refs/tags/ that are deleted are backed up (as branches) as refs/backups/tags/tag-name-YYYYMMDD-HHmmss or as sequentially increasing numbers under refs/backups/tags/branch-name/# using the same plugin.ref-protection.useTimestamp setting.
By default, the backups are created as branches. Optionally, they may be created as tags, containing information about the original ref that was changed, as well as the user that performed the change. This can be enabled by setting plugin.ref-protection.createTag true.
根据说明 是当在gerrit上删除分支/或者采用了 git 强制push的时候,会触发这个备份分支的动作。
在使用过程中发现,git 强制push的时候会报如下的错误。通过分析发现是 git push的这个账号没有
在 refs/backups/* 下面有 create refs 的权限。加上这个权限就不会报错了。
不过总觉得这个不合理。你管我怎么操作的,你都要给我备份了就行了。
[2019-12-31 16:23:13,294] [ReceiveCommits-1] ERROR com.googlesource.gerrit.plugins.refprotection.BackupRef : CreateBranch.Input: refs/backups/heads/test_for_20191231_162313-5130c6f4d1dd84a9eae13eca14e627db50f843bd
[2019-12-31 16:23:13,294] [ReceiveCommits-1] ERROR com.googlesource.gerrit.plugins.refprotection.BackupRef : CreateBranch.Input: com.google.gerrit.server.project.CreateBranch$Factory
[2019-12-31 16:23:13,294] [ReceiveCommits-1] ERROR com.googlesource.gerrit.plugins.refprotection.BackupRef : project: com.google.gerrit.server.project.ProjectResource@55f9da39
[2019-12-31 16:23:13,297] [ReceiveCommits-1] ERROR com.googlesource.gerrit.plugins.refprotection.BackupRef : Cannot create "refs/backups/heads/test_for_20191231_162313"
com.google.gerrit.extensions.restapi.AuthException: Cannot create "refs/backups/heads/test_for_20191231_162313"
at com.google.gerrit.server.project.CreateBranch.apply(CreateBranch.java:138)
at com.googlesource.gerrit.plugins.refprotection.BackupRef.createBackup(BackupRef.java:162)
at com.googlesource.gerrit.plugins.refprotection.RefUpdateListener.onEvent(RefUpdateListener.java:92)
at com.google.gerrit.common.ChangeHookRunner.fireEventForUnrestrictedListeners(ChangeHookRunner.java:742)
at com.google.gerrit.common.ChangeHookRunner.fireEvent(ChangeHookRunner.java:789)
at com.google.gerrit.common.ChangeHookRunner.doRefUpdatedHook(ChangeHookRunner.java:610)
at com.google.gerrit.server.git.ReceiveCommits.processCommands(ReceiveCommits.java:662)
at com.google.gerrit.server.git.AsyncReceiveCommits$Worker.run(AsyncReceiveCommits.java:89)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at com.google.gerrit.server.util.RequestScopePropagator$5.call(RequestScopePropagator.java:222)
at com.google.gerrit.server.util.RequestScopePropagator$4.call(RequestScopePropagator.java:201)
at com.google.gerrit.server.util.ThreadLocalRequestScopePropagator$1.call(ThreadLocalRequestScopePropagator.java:55)
at com.google.gerrit.server.util.RequestScopePropagator$1.call(RequestScopePropagator.java:98)
at com.google.gerrit.server.util.RequestScopePropagator$2.run(RequestScopePropagator.java:131)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at com.google.gerrit.server.git.WorkQueue$Task.run(WorkQueue.java:376)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
在 refs/backups/* 下面有 create refs 的权限
-[access "refs/backups/*"]
- create = group Administrators
下面这个是在gerrit上删除分支 触发的 打印的日志。
[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]
[2019-12-31 16:21:26,180] [HTTP-71] ERROR com.googlesource.gerrit.plugins.refprotection.BackupRef : CreateBranch.Input: refs/backups/heads/test4_for_20191231_162126-5130c6f4d1dd84a9eae13eca14e627db50f843bd
[2019-12-31 16:21:26,180] [HTTP-71] ERROR com.googlesource.gerrit.plugins.refprotection.BackupRef : CreateBranch.Input: com.google.gerrit.server.project.CreateBranch$Factory
[2019-12-31 16:21:26,180] [HTTP-71] ERROR com.googlesource.gerrit.plugins.refprotection.BackupRef : project: com.google.gerrit.server.project.ProjectResource@2ad678a6
下面准备通过源码来 跟踪一下执行过程,看看为啥会有这个区别。或者为啥会有这个报错。
准备工作
gerrit 2.12.x 版本
从github克隆插件源代码。并且检出到 2.12的分支上。
~/gerrit/plugins/ref-protection
$ git ll
* 3422dca - Merge branch 'stable-2.11' into master — Doug Kelly (HEAD, origin/stable-2.12) - (4 年 2 个月前)
|\
| * 0359382 - Fix buck test in standalone BUCK build — David Ostrovsky - (4 年 7 个月前)
| * 31473ff - Add standalone BUCK build — David Pursehouse - (4 年 7 个月前)
* | 0b80a00 - Add documentation updates — Doug Kelly - (4 年 5 个月前)
* | bc23cba - Add details from original tag — Doug Kelly - (4 年 3 个月前)
* | 7ca1b83 - Add ability to back up as tag — Doug Kelly - (4 年 3 个月前)
* | 164b578 - Correct backup of tags — Doug Kelly - (4 年 2 个月前)
* | 241b34a - Switch to EventListener