Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git预提交挂钩,以确保HEAD是主回购的最新版本_Git_Hook_Pre Commit Hook - Fatal编程技术网

git预提交挂钩,以确保HEAD是主回购的最新版本

git预提交挂钩,以确保HEAD是主回购的最新版本,git,hook,pre-commit-hook,Git,Hook,Pre Commit Hook,我正在将我的团队从一个旧的CVS存储库转移到使用git。我希望添加一个预提交挂钩,以确保在本地(并推送)完成提交之前,每个人都有一个最新的回购协议 例如,在CVS中,每个人都会在进行更改之前进行“CVS启动”,然后提交。我想强制它,这样人们就不能提交更改,除非他们先做了一个git-pull-origin-master(我们不会使用额外的分支) 有没有一个简单的方法可以做到这一点?为任何帮助干杯:)检查并查看来自git ls远程源磁头(远程提示)和git rev解析磁头(本地提示)的SHA是否相等

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

例如,在CVS中,每个人都会在进行更改之前进行“CVS启动”,然后提交。我想强制它,这样人们就不能提交更改,除非他们先做了一个
git-pull-origin-master
(我们不会使用额外的分支)


有没有一个简单的方法可以做到这一点?为任何帮助干杯:)

检查并查看来自
git ls远程源磁头
(远程提示)和
git rev解析磁头
(本地提示)的SHA是否相等

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

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

编辑 实际上,如果您只是执行git pull(而不是重定基址),您将无法比较头,因为pull将执行合并提交。相反,您需要将
git ls remote origin HEAD
git merge base origin/HEAD
进行比较

其他一些评论
  • 为什么要使用Git,但根本不使用额外的分支?这有点像买了一辆车,但从不使用发动机(而是到处推)。分支在Git中很便宜,建立起来很快,合并起来几乎不费吹灰之力。如果你不利用它们,你就是在伤害自己

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


  • 与前一点相关:由于默认情况下拒绝非快进推送,因此实际上不需要挂钩。只要告诉你的开发者“如果你的推送因为非快进而被拒绝,做一个
    git pull
    ,然后再次尝试推送”,一切都会成功


这破坏了git的“分布式”特性。它使每一项承诺都有点全球性。cvs“提交”类似于git“推送”,这是与远程端通信的内容


如果您真的想利用分布式模型,您应该鼓励并让您的团队了解本地提交的要点,而不是让系统在每次提交时都执行中央回购(这是集中的)。

如果您正在跟踪远程分支:

git fetch
git log HEAD..origin
# or:
git diff ...origin
正如其他答案所暗示的那样,强制进行此类检查对于任何远程回购并不总是一个好的解决方案,但可以作为一个有趣的警告

别忘了这一点。

因此,无论如何,
git pull
将是避免该消息的方法。

“由于非快进推送在默认情况下被拒绝,因此您实际上不需要钩子。”我的观点正是如此;)+1.您甚至可以通过以下方式自动给出此建议:参见
advice.pushNonFastForward
。或者在远程端使用
receive.denynonfastfrows
(即使使用强制推送也会阻止它)。(
advice.pushnonfastfroward
默认启用。)true,这意味着默认情况下会处理“
git pull
first”建议。您实际想解决的问题是什么?你提出的解决方案只会削弱Git,让人们讨厌它。这不是使用Git的方式