git pre commit hook 以确保 HEAD 从 master repo 是最新的

标签 git hook pre-commit-hook

我正在将我的团队从旧的 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 HEADgit 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/

相关文章:

SVN - 在开始提交 Hook 中获取提交大小?

git - 将 git repo 中的目录移动到另一个 git repo,保留部分提交历史记录

c++ - 在 C/C++ 源代码中包含 Git 提交哈希和/或分支名称

php - Hook 到 Wordpress 图片上传

c - c中的全局键盘 Hook

git - 为什么我的 git 预提交钩子(Hook)不修剪行尾的空白?

git - 将多个 .gitignore 文件(本地和远程)保存在同一个存储库中

git - 使用 git : committed changes in one branch affect 'master'

c - 进程 Hook 问题

git:我可以存储未跟踪的文件而不将其添加到索引吗?