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

Clo*_*oud 5 linux git version-control github command-line-interface

背景

我正在与一个使用进行版本控制的大型团队合作。正常流程是:

  • 人们从“积压队列”中选择一张票。
  • 通过本地分支(即git checkout -b my_feature_branch)处理该问题。
  • 进行多次提交(即git commit)。
  • 将本地更改推送到远程分支以“备份”他们的工作,使其存在于多台机器上,以防笔记本电脑损坏或被盗(即 git push -u origin my_feature_branch)。
  • 最终在我们的私人上创建代码审查 页面,并从功能分支到master.

除了员工的需要的基础上创建的远程功能分支,我们有一个用于创建“黄金构建”我们交付给客户,即几十发布分支1.001.012.002.012.02,等。


问题

一些开发者开始抱怨分支太多,我倾向于同意。一些开发人员在不再需要旧分支时没有勤奋地清理它们(即使 一旦代码审查完成,为此提供一键删除功能)。


有没有办法配置我们公司 部署,以便当人们git branch通过 CLI使用时:

  • 只有我们的“重要/发布/黄金”分支出现。
  • 一次性开发人员(临时)分支仅通过git branch -a?

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

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

Yus*_*ali 4

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

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

引用文档:

Git 支持将单个存储库的 ref 划分为多个命名空间,每个命名空间都有自己的分支、标签和 HEAD。Git 可以将每个命名空间公开为一个独立的存储库,以便从中提取和推送,同时共享对象存储

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


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

导出 GIT_NAMESPACE=foo

或者

git --namespace=foo 克隆/拉/推

当命名空间处于活动状态时,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)
Run Code Online (Sandbox Code Playgroud)

合并上游

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)
Run Code Online (Sandbox Code Playgroud)

棘手的部分

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

注意

推的时候要注意。Git 将推送当前名称空间。如果您在功能分支中工作并且忘记激活名称空间,则在推送时,您将在主参考中创建功能分支。