Git 是否可以禁用do“;推力;,其中“覆盖”;大师;存储库的主干?

Git 是否可以禁用do“;推力;,其中“覆盖”;大师;存储库的主干?,git,Git,对于主干“master”,我可以执行“git reset hard”到更早的提交,然后执行“git push force”,在存储库中重写它。在这次承诺之后,我失去了部分发展。 但是,如果对于某些分支来说,它不是那么关键,那么对于主干来说,“master”是非常关键的。 是否可以禁用覆盖存储库“主”主干的do“push force”,以及如何关闭它?我遇到的在每个分支上禁用强制推送的唯一方法是使用预接收挂钩,如所示(我没有编写此挂钩,但它很有用) 这其中的关键部分是 while read old

对于主干“master”,我可以执行“git reset hard”到更早的提交,然后执行“git push force”,在存储库中重写它。在这次承诺之后,我失去了部分发展。 但是,如果对于某些分支来说,它不是那么关键,那么对于主干来说,“master”是非常关键的。
是否可以禁用覆盖存储库“主”主干的do“push force”,以及如何关闭它?

我遇到的在每个分支上禁用强制推送的唯一方法是使用预接收挂钩,如所示(我没有编写此挂钩,但它很有用)

这其中的关键部分是

while read oldrev newrev ref ; do
    # old revision is blank - branch creation
    if [ "$oldrev" = "0000000000000000000000000000000000000000" ] || 
         # new revision is blank - branch deletion
         [ "$newrev" = "0000000000000000000000000000000000000000" ] ||
         # branch != master - pass through
         [ "$ref" != "refs/heads/master" ] ;
    then
        # create new or delete old branch
        # or force pushing to non-master branch
        continue;
    fi

    base=$(git merge-base $oldrev $newrev);
    if [ "$base" != "$oldrev" ] ; then
        # non fast forward merge
        echo "Force pushing of $ref is forbidden to master";
        exit 1;
    fi
done
exit 0;
这仍然允许您删除/创建主分支并强制推送到其他分支,但会阻止您强制推送到主分支本身

可以通过设置全局禁用强制推送

  • receive.denynonfastforts
  • 收到,denyDeletes

但是对于每个分支,这都会关闭它们

这取决于存储库的托管方式/托管位置。在许多情况下,如果托管解决方案允许您配置此功能,则只能一次为所有分支设置此功能。谢谢!是否有可能禁用特定分支中特定用户的“push-force”,例如通过gitosis或gitolite?关于如何只允许特定用户使用相同的预接收挂钩,请参见我的回答。但是请注意,这不是一个完美的解决方案,如果用户真的想打破它,它是可能的。