如何使用git命名空间隐藏分支

背景

我正在和一个使用git进行版本控制的团队合作。 正常的stream程是:

  • 人们从“积压队列”中select一张票。
  • 通过本地分支(即git checkout -b my_feature_branch )处理该问题。
  • 进行几次提交(即git commit )。
  • 将本地更改推送到远程分支为了“备份”他们的工作,以便它住在多台机器上,以防笔记本电脑损坏或被盗(即git push -u origin my_feature_branch )。
  • 最终创build一个代码审查我们的私人 github页面,并执行从function分支压缩合并到master

除了由员工根据需要创build的远程function分支之外,我们还有数十个发布分支,用于创build我们向客户发送的“黄金版本”,即1.00等。


问题

一些开发商已经开始抱怨分支太多了,我倾向于同意。 有些开发商没有勤勉地清理不再需要的旧分支(尽pipe如此 一旦代码审查完成, github提供了一键删除function)。


有没有办法configuration我们的公司 github部署,以便当人们通过CLI使用git branch

  • 只有我们的“重要/释放/黄金”分支出现。
  • 一次性开发者(临时)分支只能通过git branch -a出现git branch -a

这样做的主要目标是减less混乱。

编辑: 我发现了一个类似的问题 ,但唯一的答案是根本不适用(不要使用远程分支),这违反了我的关键约束,允许人推送到远程分支作为数据备份的一种forms。 @Mort暗示的私有名称空间的概念似乎正是我正在寻找的。 现在,我该如何做到这一点?

长话短说: 你可以 – 但它可能有点棘手。

你应该使用namespace概念(看看这里: gitnamespaces )

从文档引用:

Git支持将单个资源库的引用划分为多个名称空间,每个名称空间都有自己的分支,标签和HEAD。 Git可以将每个名称空间公开为一个独立的存储库,以便共享对象存储

将多个存储库作为单个存储库的名称空间存储可避免存储相同对象的重复副本,例如存储同一个源的多个分支时。


要激活命名空间,您可以简单地:

导出GIT_NAMESPACE = foo

要么

git –namespace = foo clone / pull / push

当命名空间处于活动状态时,通过git remote show origin您只能看到在当前名称空间中创建的远程分支。 如果你停用它( unset GIT_NAMESPACE ),你将会再次看到主要的远程分支。


您的情况可能的工作流程可能是:

创建一个功能分支并对其进行处理

 export GIT_NAMESPACE=foo git checkout -b feature_branch # ... do the work ... git commit -a -m "Fixed my ticket from backlog" git push origin feature_branch # (will push into the namespace and create the branch there) 

上游合并

 unset GIT_NAMESPACE git checkout master git pull (just to have the latest version) git merge --squash --allow-unrelated-histories feature_branch git commit -a -m "Merged feature from backlog" git push # (will push into the main refs) 

棘手的部分

命名空间提供了分支的完全隔离,但是每次都需要激活和取消激活命名空间

请注意

推动时请注意。 Git会推入当前的命名空间。 如果您正在使用功能分支,并且您忘记激活命名空间,则在推送时,您将在主参考中创建功能分支。

看起来好像这里最简单的解决方案,因为你使用的是GitHub和一个pull-request工作流程,开发者应该把他们自己的仓库分支,而不是共享的仓库。 这样,他们的远程功能分支对其他任何人都是不可见的,所以他们看到的任何“混乱”将完全是他们自己的责任。


如果所有东西都存放在一个存储库中,另一个选择是设置一个简单的web服务,当你关闭一个pull request(响应PullRequest事件 )时,它接收来自github的通知。 然后您可以删除与该请求对应的源分支。

这比以前的解决方案简单得多,因为它涉及(a)编写代码和(b)运行持久服务(c)可以被github webook访问,并且(d)在远程存储库上具有适当的权限。