最近的一些git研究
前话
最近在写 git 的一个服务,也就是 growerlab 的一个组件。
mensa - 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 的本身的很多问题都是可以通过测试发现的,有的坑必须踩呀。
又记一片流水账。。