我正在将我的团队从旧的 CVS 存储库转移到使用 git。我希望添加一个 precommit 钩子,以确保在本地完成(并推送)提交之前,每个人都有一个最新的 repo。
例如,在 CVS 中,每个人都会在进行更改之前执行“cvs up”,然后提交。我想强制它,这样人们就不能提交更改,除非他们已经做了git pull origin master
第一个(我们不会使用额外的分支)
是否有捷径可寻?为任何帮助欢呼:)
我正在将我的团队从旧的 CVS 存储库转移到使用 git。我希望添加一个 precommit 钩子,以确保在本地完成(并推送)提交之前,每个人都有一个最新的 repo。
例如,在 CVS 中,每个人都会在进行更改之前执行“cvs up”,然后提交。我想强制它,这样人们就不能提交更改,除非他们已经做了git pull origin master
第一个(我们不会使用额外的分支)
是否有捷径可寻?为任何帮助欢呼:)
git ls-remote origin HEAD
检查并查看(远程提示)和(本地提示)的 SHAgit rev-parse HEAD
是否相等?
请注意,在这样做的过程中,您放弃了Git 的很多灵活性——想想这是否真的是您想要做的。的部分优势git pull
在于,即使您提交了与主副本不同的内容,当您从主副本中提取时,您的更改也可以合并(并且在大多数情况下,该过程是完全自动的)。
如果您的目标是拥有线性提交历史(有其自身的权衡),我建议您查看该rebase
命令,而不是强迫您的开发人员永远不要在 origin/master 之后提交。
实际上,如果你只是做git pull
(而不是变基),你将无法比较头部,因为 pull 将进行合并提交。相反,您需要git ls-remote origin HEAD
比较git merge-base origin/HEAD HEAD
.
你为什么使用 Git,但根本不使用额外的分支?这有点像买一辆车,但从不使用引擎(而是把它推到任何地方)。Git 中的分支很便宜,可以快速设置,并且几乎可以毫不费力地合并。如果你不利用它们,你就是在伤害自己。
为什么您在进行更改之前关心每个人都是最新的?这不是 CVS,冲突解决并不可怕——Git 会为你自动解决 95% 的冲突,而无需你做任何事情,所以无论你是git pull
在你做出改变之前还是之后都无关紧要——你只是在你推之前需要拉,你会没事的。
与上一点相关:由于默认情况下会拒绝非快进推送,因此您实际上并不需要钩子。只需告诉您的开发人员“如果您的推送因非快进而被拒绝,请执行 a git pull
,然后再次尝试推送”,一切都会奏效。
这破坏了 git 的“分布式”特性。它使每个提交都具有某种程度的全球性。cvs "commit" 类似于 git "push",它与远程端通信。
如果你真的想利用分布式模型,你应该鼓励并让你的团队理解本地提交的意义,而不是让系统在每次提交时都点击中央仓库(这是集中式的)。
如果您正在跟踪远程分支:
git fetch
git log HEAD..origin
# or:
git diff ...origin
正如其他答案所暗示的那样,对于任何远程回购来说,强制进行这种检查并不总是一个好的解决方案,但作为警告可能会很有趣。
不要忘记,git push
如果 a 不是快进更改,默认情况下将被拒绝。
因此git pull
,无论如何,这将是避免该消息的方法。