git Prepommit挂钩以确保大师仓库最新
-
10-10-2019 - |
题
我将团队从旧的CVS存储库移到使用Git。我希望添加一个挂钩,以确保在本地完成提交之前(并推动)每个人都有最新的回购。
例如,在CVS中,每个人都会在更改然后进行更改之前进行“ CVS”。我想强制它,以便人们无法做出改变,除非他们做了 git pull origin master
首先(我们不会使用额外的分支)
是否有捷径可寻?为任何帮助加油:)
解决方案
检查并查看Shas是否来自 git ls-remote origin HEAD
(远程提示)和 git rev-parse HEAD
(本地提示)相等?
请注意,这样做,您正在扔掉 很多 Git的灵活性 - 考虑是否是 真的 你想做什么。一部分 git pull
即使您提交了与主副本不同的事情,当您从主副本中提取时,您的更改也可以合并(在大多数情况下,该过程完全是自动的)。
如果您的目标是拥有线性提交历史(具有自己的权衡取舍),我建议您看看 rebase
命令而不是强迫开发人员永远不会在Origin/Master背后提交。
编辑
实际上,如果你只是在做 git pull
(而不是重新审视),您将无法比较头部,因为拉力会合并提交。相反,您需要比较 git ls-remote origin HEAD
至 git merge-base origin/HEAD HEAD
.
其他一些评论
您为什么要使用git,而根本不使用额外的分支?这就像购买汽车一样,但从未使用发动机(而只是将其推到到处都是)。分支是 便宜的 在git中,快速设置,几乎毫不费力地合并。如果您不使用它们,就会为自己造成伤害。
您为什么要在进行更改之前关心每个人的最新状态?这不是CVS,解决冲突并不可怕 - Git将在不必做的事情的情况下自动解决95%的冲突,因此是否您是否
git pull
在进行更改之前或之后并不重要 - 您只需要在推动之前拉动,就可以了。与上一点点相关:由于默认情况下拒绝了非快速推动推动,因此您实际上不需要挂钩。只需告诉您的开发人员“如果您的推动被拒绝为非福特前卫,请做一个
git pull
, ,然后尝试再次推动“一切都会起作用。
其他提示
这破坏了git的“分布式”性质。它使每个提交都有一定的全球性。 CVS“提交”类似于git“ push”,这就是与遥控端传达的。
如果您确实想利用分布式模型,则应鼓励并使您的团队了解本地提交的意义,而不是使系统在每个提交中(被锯掉集中式)中的中心存储库。
如果您要跟踪远程分支:
git fetch
git log HEAD..origin
# or:
git diff ...origin
正如其他答案所提到的那样,强迫这种检查并不总是一个很好的解决方案 任何 远程存储库,但可以作为警告很有趣。
不要忘记一个 git push
默认情况下,如果不是快速的更改,将被拒绝.
所以 git pull
无论如何,将是避免该消息的方法。