Git:无条件地阻止结账到另一个分支?

时间:2015-05-23 02:29:29

标签: git

有没有办法阻止开发人员查看其他分支?我的问题非常简单:我的团队中的某个人不断检查生产环境中的不同分支,这当然会导致代码中出现的所有问题都不应该结束,或者代码存在但是在结账后消失了。

我在这里检查了一个可能的git钩子列表https://www.kernel.org/pub/software/scm/git/docs/githooks.html,但我找不到任何在这种情况下有用的钩子。

另外,我发现了一个类似的问题(Prevent a checkout in Git),建议在工作流程中使用脚本而不是git checkout命令。但它并没有真正解决我的问题,因为我甚至不确定是否由一些不知道git手动进行结账,或者是由于配置错误导致IDE配置不当以及将本地项目链接到远程一个人自动结账,因此使用它的开发人员甚至都不知道。在这种情况下,即使我使用脚本而不是git checkout,我仍然必须禁用标准git checkout

有人知道解决方案吗?或者可以使用post-checkout钩子来结账?它仍然比没有好。

2 个答案:

答案 0 :(得分:4)

在像Git这样的分布式环境中,您只能在受祝福的服务器级别(所有程序员都需要推回)执行策略。
不是在客户端(每个程序员都克隆了一个仓库,可以检查他们想要的任何分支)

例如,一个简单的政策,如:

  • prod branch的专用回购
  • 设置在该回购上的
  • git config receive.denyNonFastForwards true将确保在prod上完成的任何推送至少包括prod分支的所有现有历史记录,以及一些新的提交。

仅此一项将确保对该分支所做的任何贡献实际上都基于所述分支。

更复杂的政策是authorization layer,例如 gitolite ,可以protect a specific branch of a repo(甚至a specific folder or file),无需将生产分支隔离在自己的仓库中。

答案 1 :(得分:0)

在某些没有自动化部署的小型项目中,

我将ssh进入服务器,然后由于某个错误而(几乎)签出另一个分支,以为我在本地计算机上工作。当发生这种情况时,这让我非常害怕!

为防止这种情况,我为git创建了一个代理脚本。该脚本将代替git本身运行,并过滤子命令。如果子命令是checkout,它将退出脚本。如果这是另一个子命令,它将使用原始参数将其转发到真实的Git应用程序。

这是代理脚本。您可以将其放置在机器上的任何位置,以防止git checkout。

git-proxy.sh

#!/usr/bin/env bash

# This will not block non-interactive shell execution
if [ ! -z "$PS1" ]; then
    command git $@
    exit 0
fi

case $1 in
    checkout)
        echo "prevented execution of git checkout"
        exit 1
    ;;
esac

# https://www.cyberciti.biz/faq/ignore-shell-aliases-functions-when-running-command/
command git $@

然后在您的.bashrc文件中,添加以下别名

alias git='/home/myuser/scripts/git-proxy.sh'

然后只需运行git checkout即可得到以下结果:prevented execution of git checkout

其他方法

使用别名,它可能无法涵盖所有​​可能的情况。如果那没有帮助,您可以尝试(我尚未尝试过)在您的系统which git上查找Git的位置,并将其移至其他名称mv git the-real-git。然后将代理放置在git mv git-proxy.sh git

的原始位置

旁注

我不是bash向导,因此这可能不是最简洁的方法,但它应该可以工作。请注意,移动原始git应用程序可能会产生意想不到的后果。当git更新时,这可能会删除代理(或者可能会中断git的安装,我不知道)