我将团队从旧的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 HEADgit 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 无论如何,将是避免该消息的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top