git预提交挂钩,以确保HEAD是主回购的最新版本
我正在将我的团队从一个旧的CVS存储库转移到使用git。我希望添加一个预提交挂钩,以确保在本地(并推送)完成提交之前,每个人都有一个最新的回购协议 例如,在CVS中,每个人都会在进行更改之前进行“CVS启动”,然后提交。我想强制它,这样人们就不能提交更改,除非他们先做了一个git预提交挂钩,以确保HEAD是主回购的最新版本,git,hook,pre-commit-hook,Git,Hook,Pre Commit Hook,我正在将我的团队从一个旧的CVS存储库转移到使用git。我希望添加一个预提交挂钩,以确保在本地(并推送)完成提交之前,每个人都有一个最新的回购协议 例如,在CVS中,每个人都会在进行更改之前进行“CVS启动”,然后提交。我想强制它,这样人们就不能提交更改,除非他们先做了一个git-pull-origin-master(我们不会使用额外的分支) 有没有一个简单的方法可以做到这一点?为任何帮助干杯:)检查并查看来自git ls远程源磁头(远程提示)和git rev解析磁头(本地提示)的SHA是否相等
git-pull-origin-master
(我们不会使用额外的分支)
有没有一个简单的方法可以做到这一点?为任何帮助干杯:)检查并查看来自
git ls远程源磁头
(远程提示)和git rev解析磁头
(本地提示)的SHA是否相等
请注意,这样做是在浪费Git的大量灵活性——想想这是否真的是你想要做的。git pull
的部分优势在于,即使您提交了与主副本不同的内容,当您从主副本中提取时,您的更改也可以合并到其中(在大多数情况下,该过程是完全自动的)
如果您的目标是有一个线性提交历史记录(它有自己的权衡),我建议查看rebase
命令,而不是强制开发人员永远不要在origin/master之后提交
编辑
实际上,如果您只是执行git pull(而不是重定基址),您将无法比较头,因为pull将执行合并提交。相反,您需要将git ls remote origin HEAD
与git merge base origin/HEAD
进行比较
其他一些评论
- 为什么要使用Git,但根本不使用额外的分支?这有点像买了一辆车,但从不使用发动机(而是到处推)。分支在Git中很便宜,建立起来很快,合并起来几乎不费吹灰之力。如果你不利用它们,你就是在伤害自己
- 为什么你关心每个人在做出改变之前都是最新的?这不是CVS,冲突解决并不可怕-Git将自动为您解决95%的冲突,而您无需做任何事情,因此,无论您在进行更改之前还是之后
,都不重要-您只需在推之前拉,就可以了Git pull
- 与前一点相关:由于默认情况下拒绝非快进推送,因此实际上不需要挂钩。只要告诉你的开发者“如果你的推送因为非快进而被拒绝,做一个
,然后再次尝试推送”,一切都会成功git pull
如果您真的想利用分布式模型,您应该鼓励并让您的团队了解本地提交的要点,而不是让系统在每次提交时都执行中央回购(这是集中的)。如果您正在跟踪远程分支:
git fetch
git log HEAD..origin
# or:
git diff ...origin
正如其他答案所暗示的那样,强制进行此类检查对于任何远程回购并不总是一个好的解决方案,但可以作为一个有趣的警告
别忘了这一点。因此,无论如何,
git pull
将是避免该消息的方法。“由于非快进推送在默认情况下被拒绝,因此您实际上不需要钩子。”我的观点正是如此;)+1.您甚至可以通过以下方式自动给出此建议:参见advice.pushNonFastForward
。或者在远程端使用receive.denynonfastfrows
(即使使用强制推送也会阻止它)。(advice.pushnonfastfroward
默认启用。)true,这意味着默认情况下会处理“git pull
first”建议。您实际想解决的问题是什么?你提出的解决方案只会削弱Git,让人们讨厌它。这不是使用Git的方式