我正在将我的团队从旧的 CVS 存储库转移到使用 git。我希望添加一个预提交 Hook ,以确保在本地完成(并推送)提交之前,每个人都有一个最新的 repo 协议(protocol)。
例如,在 CVS 中,每个人都会在进行更改之前执行“cvs up”,然后再提交。我想强制执行它,这样人们就无法提交更改,除非他们首先完成了 git pull origin master
(我们不会使用额外的分支)
有没有简单的方法来做到这一点?为任何帮助干杯:)
最佳答案
检查 git ls-remote origin HEAD
(远程提示)和 git rev-parse HEAD
(本地提示)的 SHA 是否相等?
请注意,在执行此操作时,您将放弃 很多 Git 的灵 active - 想想这是否是您真的想要做的。 git pull
的部分优势在于,即使您提交了与主副本不同的内容,当您从主副本中 pull 时,您的更改也可以 merge 到其中(在大多数情况下,过程是完全自动的)。
如果您的目标是拥有线性提交历史记录(这有其自身的权衡),我建议您看一下 rebase
命令,而不是强制您的开发人员永远不要提交起源/主人。
编辑
实际上,如果您只执行 git pull
(而不是 rebase ),您将无法比较头部,因为 pull 会执行 merge 提交。相反,您需要将 git ls-remote origin HEAD
与 git merge-base origin/HEAD HEAD
进行比较。
一些其他评论
为什么您使用 Git,但根本不使用额外的分支?这有点像买了一辆汽车,但从不使用引擎(而是到处推着它)。 Git 中的分支便宜,设置起来很快, merge 起来几乎毫不费力。如果您不使用它们,您就是在伤害自己。
为什么您关心每个人在进行更改之前是否了解最新信息?这不是 CVS,冲突解决并不可怕 - Git 会自动为您解决 95% 的冲突,而无需您做任何事情,因此无论您是
git pull
之前还是之后变化并不重要——你只需要在 push 之前 pull 就可以了。与前一点相关:由于默认情况下拒绝非快进推送,因此您实际上不需要 Hook 。只需告诉您的开发人员“如果您的推送因非快进而被拒绝,请执行
git pull
,然后再次尝试推送”,一切都会正常进行。
关于git pre commit hook 以确保 HEAD 从 master repo 是最新的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3994252/