git precommit hook以确保HEAD是来自master repo的最新版本

bob*_*tle 2 git hook pre-commit-hook

我正在将我的团队从旧的CVS存储库转移到使用git.我希望添加一个precommit钩子,以确保在本地完成提交(并推送)之前,每个人都有一个最新的回购.

例如,在CVS中,每个人都会在进行更改之前进行'cvs up',然后进行提交.我想强制它,所以人们不能提交更改,除非他们已经做了git pull origin master第一次(我们不会使用额外的分支)

是否有捷径可寻?欢呼任何帮助:)

Amb*_*ber 5

检查并查看来自git ls-remote origin HEAD(远程提示)和git rev-parse HEAD(本地提示)的SHA 是否相等?

请注意,在这样做的过程中,你会失去很多 Git的灵活性 - 想想这是否真的是你想做的事情.部分优势git pull在于,即使您提交了与主副本不同的内容,当您从主副本中提取时,您的更改也可以合并(并且在大多数情况下,该过程完全是自动的).

如果您的目标是拥有一个线性提交历史记录(它有自己的权衡),我建议rebase您查看该命令,而不是强迫您的开发人员永远不要在origin/master之后提交.

编辑

实际上,如果你正在做git pull(而不是重新定位),你将无法比较头部,因为pull将进行合并提交.取而代之的是,你需要比较git ls-remote origin HEADgit merge-base origin/HEAD HEAD.

其他一些评论

  • 你为什么使用Git,但之后根本不使用额外的分支?这有点像买车,但从不使用引擎(而只是推动它到处都是).分支在Git中很便宜,设置快,并且几乎不费力地合并.如果你不使用它们,你自己就是一种伤害.

  • 在进行更改之前,为什么要关心每个人都是最新的?这不是CVS,冲突解决并不可怕--Git将为您自动解决95%的冲突而无需您做任何事情,因此无论您git pull在进行更改之前还是之后都没关系 - 您只需在你推动之前需要拉动,你会没事的.

  • 与前一点相关:由于默认情况下拒绝非快进推送,因此您实际上不需要挂钩.只需告诉您的开发人员"如果您的推送被拒绝为非快进,请执行操作git pull,然后再次尝试推送",一切都会正常工作.