Git服务器端git log -g命令无法正常运行的问题排查
解决GitLab post-receive钩子中
git log -g返回空的问题 问题根源
GitLab服务器上的仓库是裸仓库,默认不会维护引用日志(reflog)。而-g(即--walk-reflogs)选项完全依赖reflog遍历提交记录,本地非裸仓库会自动生成reflog所以能正常运行,但钩子在裸仓环境下执行时,自然拿不到任何结果。
替代方案
既然-g走不通,换两种方式直接获取新分支的首个提交哈希:
方案1:用git rev-list反向遍历
直接执行这条命令就能拿到分支的根提交哈希:
git rev-list --reverse $refname | head -n 1
--reverse会把提交顺序反过来,从最早的提交开始列,head -n 1取第一行就是首个提交。
方案2:用git log反向输出
和上面效果一致,只是用git log实现:
git log --reverse --pretty=%H $refname | head -n 1
额外提示:新分支的全提交获取
因为新分支推送时oldrev是全0哈希,没法用oldrev..newrev的写法,要拿该分支所有提交的话,直接用git rev-list $refname就行,不需要范围限定。
测试示例
把钩子中的原命令替换成下面的代码,推送新分支后就能看到输出的首个提交哈希:
first_commit=$(git rev-list --reverse $refname | head -n 1) echo "新分支首个提交哈希:$first_commit"
内容的提问来源于stack exchange,提问作者João Carlos Sousa
相关产品推荐
相关产品推荐

