Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.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:无条件阻止签出到其他分支?_Git - Fatal编程技术网

Git:无条件阻止签出到其他分支?

Git:无条件阻止签出到其他分支?,git,Git,有没有办法阻止开发人员签出不同的分支?我的问题很简单:我的团队中有人一直在检查生产环境中的另一个分支,这当然会导致不应该出现在那里的代码出现各种问题,或者在检查后消失的代码出现各种问题 我在这里查看了一个可能的git钩子列表,但在这种情况下找不到任何有用的钩子 此外,我还发现了一个类似的问题(),建议在工作流中使用脚本而不是git checkout命令。但这并不能真正解决我的问题,因为我甚至不确定签出是由不了解git的开发人员手动进行的,还是由于配置不当的IDE导致的,由于配置不当,并将本地项目

有没有办法阻止开发人员签出不同的分支?我的问题很简单:我的团队中有人一直在检查生产环境中的另一个分支,这当然会导致不应该出现在那里的代码出现各种问题,或者在检查后消失的代码出现各种问题

我在这里查看了一个可能的git钩子列表,但在这种情况下找不到任何有用的钩子

此外,我还发现了一个类似的问题(),建议在工作流中使用脚本而不是
git checkout
命令。但这并不能真正解决我的问题,因为我甚至不确定签出是由不了解git的开发人员手动进行的,还是由于配置不当的IDE导致的,由于配置不当,并将本地项目链接到远程项目,所以使用它的开发人员甚至不知道这一点。在这种情况下,即使我使用脚本而不是
git签出
,我仍然必须禁用标准的
git签出

有人知道解决这个问题的办法吗?或者可以使用
签出后
钩子签回?这总比什么都没有好。

在Git这样的分布式环境中,您只能在神圣的服务器级别强制执行策略(所有程序员都需要返回到该级别)。
不是在客户端级别(每个程序员都克隆了一个repo,可以签出他们想要的任何分支)

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

  • prod分行的专用回购协议
  • 在该repo上设置git config receive.denynonfastforts true将确保在prod上执行的任何推送操作至少包括prod分支的所有现有历史记录,以及一些新提交
仅此一点就可以确保对该分支所做的任何贡献实际上都基于该分支


一个更复杂的策略类似于,它可以(甚至)消除在其自身的repo中隔离生产分支的需要。

在我的情况下,在一些没有自动部署的小项目中,我会使用ssh连接到服务器,然后有时会错误地(几乎)连接到服务器结帐离开另一家分行,相信我正在使用本地计算机。这让我很害怕

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

这是代理脚本。您可以在机器上的任何位置放置想要阻止git签出的内容

git-proxy.sh 然后在
.bashrc
文件中添加以下别名

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

然后只需运行
git checkout
即可获得以下结果:
阻止执行git checkout

其他方法 对于别名,它可能无法涵盖所有可能的情况。如果这没有帮助,您可以尝试(我没有尝试过)在您的系统上找到Git的位置
哪个Git
,并将其移动到另一个名称
mv Git真正的Git
。然后将代理放在git
mv git-proxy.sh git

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

您是否可以使用文件权限拒绝对.git文件夹或可能仅对.git/HEAD文件的修改?您需要控制您的生产环境。你是在问怎么打一只鼹鼠,这是个糟糕的主意。如果您的同事不能处理Git、生产或IDE,那么您就有更大的问题,而不是某种胭脂程序的使用。这是一个人员培训问题,而不是技术问题。为什么一个总是把生产搞得一团糟的开发人员仍然可以访问生产?您的生产环境应该被锁定,以便只有值得信赖的人才能访问它。@Chris即使是值得信赖的人有时也会失败。找到“谁和为什么”问题的根源是一回事,但我也希望确保没有人能够再做同样的事情,这就是为什么我在这里提出一个问题。
#!/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 $@