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