有没有办法阻止开发人员查看其他分支?我的问题非常简单:我的团队中的某个人不断检查生产环境中的不同分支,这当然会导致代码中出现的所有问题都不应该结束,或者代码存在但是在结账后消失了。
我在这里检查了一个可能的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
钩子来结账?它仍然比没有好。
答案 0 :(得分:4)
在像Git这样的分布式环境中,您只能在受祝福的服务器级别(所有程序员都需要推回)执行策略。
不是在客户端(每个程序员都克隆了一个仓库,可以检查他们想要的任何分支)
例如,一个简单的政策,如:
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。
#!/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的安装,我不知道)