git 等效于 mercurials 阶段功能,用于防止推送分支

问题描述

我目前面临的问题是,由于其他人做出的一些决定,我们需要转向 git。

因此,对于 mercurial,我们有很棒的阶段功能,它允许我管理本地分支,当推送(全部)发布时,这些分支将被忽略。最大的优点是,阶段功能独立于服务器托管的主存储库。我可以在没有任何人许可的情况下在我自己的本地使用它。

使用 git,据网络搜索告诉我,您可以向公共服务器托管的主存储库添加一些带有分支过滤的钩子。我的问题是:作为开发人员,除了创建/删除/推/拉之外,我没有任何控制权。我无法在那里安装任何钩子,管理服务器的人永远不会手动修改它们。一切都由 ALM 软件管理。

因此,我在网上找到的 git 解决方案不能解决我的问题。

这引出了我的问题:git 中是否还有其他机制可以替代 mercurial 阶段的功能,这使我能够在本地存储库中防止某些分支被推送到服务器托管的存储库?

解决方法

当您没有在命令行上提供明确的规范时,您总是能够明确配置推送或获取的引用规范,并且自 v2.29 起包含否定匹配。

要将所有匹配的分支推送到原点而不是分支 notthisone,

git config --unset-all remote.origin.push
git config --add remote.origin.push :
git config --add remote.origin.push ^refs/heads/notthisone

从那时起就平淡了

git push

将推送所有匹配的分支,除了 nottthisone 即使匹配。

我看到 git push 文档没有更新以反映新功能,push 和 fetch 都使用相同的引擎来处理模式,我只是尝试了上面的序列,并且如宣传的那样工作。

这是我测试的配置文件:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "t2"]
    url = ../t2
    fetch = +refs/heads/*:refs/remotes/t2/*
    push = :
    push = ^refs/heads/b2