最近的一些git研究

2020-11-12

前话

最近在写 git 的一个服务,也就是 growerlab 的一个组件。

mensa - https://github.com/growerlab/mensa

最近做的研究主要是用户的推送时以及推送到服务器的 hook 相关的功能。

推送时的权限验证时机

整个服务流程

  • git push
  • mensa - 调用 git-refs 权限权限
  • mensa - 调用 git-receive-pack
  • mensa - 调用 hooks 创建 events
    • hook 时机
    • 新分支的 commits

hook 时机的坑

最开始是想在创建仓库的时候,ln -s 软链一个 update 的 hook 到对应的钩子,这个是很久之前的 gitlab 的版本的方式。

后来查阅 gitlab 开发的 gitaly 代码,才发现 gitlab 这些年做了很多的改造,避开了很多 n 年前的坑。

比如 hook 的接入时机改成了调用 git 命令时

git xxxx -c core.hooksPath=hook path

这样其实还是非常方便的,避免了无避免的软链

新分支的 commits

hook 的功能之一就是创建 events。

普通的 commits 还好说,但是如果一个新的 分支,并且里面有几个新的 commits 时,这个问题倒是花了我一点时间研究测试。

后来发现,调用 update hook 时,还并不会在 refs 中创建对应的分支。

并且通过 go-git 试验发现,新提交的分支中的新 commit,查找他的 parents 时,只能拿到新提交的 commits。

所以当不管用户提交新的 branch 还是新的 tag,都是可以拿到新提交的 commit 的。

在做代码托管平台时,其实很多 git 的本身的很多问题都是可以通过测试发现的,有的坑必须踩呀。

又记一片流水账。。