# 最近的一些git研究

### 前话

最近在写 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 的本身的很多问题都是可以通过测试发现的，有的坑必须踩呀。

又记一片流水账。。
