【问题标题】:How to migrate a git project from using master as the default branch to main?如何将 git 项目从使用 master 作为默认分支迁移到 main?
【发布时间】:2022-06-12 16:57:36
【问题描述】:

我是一个托管在 github/gitlab 上的项目的维护者,并且有许多贡献者。我想从使用master 作为默认分支迁移到main。我如何做到这一点而不搞砸?

我已经阅读了一些关于该主题的博客文章,但更希望在 StackOverflow 上进行讨论,在那里 cmets 可能会指出一个人可能会忽略的问题。

【问题讨论】:

    标签: git github gitlab


    【解决方案1】:

    Github 提供了迁移选项,因此很简单。但是,即使使用像 gitlab 这样的任何其他服务(还没有),只要您执行正确的步骤,它还是相对简单的,至少从技术角度来看是这样。

    无论哪种方式,除非您的项目非常小,否则最大的麻烦肯定是让您的所有贡献者正确地对正在进行的工作进行修复。

    你需要做什么

    Github

    在您的项目页面上,导航到settings,然后在“默认分支”部分中,按编辑按钮并将其从master 更改为main

    Gitlab,也就是手动迁移

    我假设您的遥控器被称为 origin - 如果它被称为不同的名称,请在所有命令中相应地将 origin 替换为该名称。

    1. 将最新的master 重命名为main,并将其推送到上游:
    git fetch origin
    git branch --move master main
    git push --set-upstream origin main
    
    1. 告诉您的上游 main 是新的默认值:

      • 导航到settings/repository,“默认分支”部分,选择main,然后按“保存更改”。然后,在同一页面上,转到“受保护的分支”部分,保护main 并取消保护master,然后按“保存更改”。
    2. 删除上游的master - 不是绝对必要的,但确实可以减少混淆:

    git push origin --delete master
    
    1. 将想要推送到master 的打开的合并/拉取请求迁移到main,而不是:
      • 在打开的合并请求中,按“编辑”。在顶部,它应该说“从 master”。将下拉菜单从 master 更改为 main

    您的合作者/同事需要做什么

    git fetch origin --prune && git branch -m master main && git branch --set-upstream-to=origin/main main
    

    据我所知,仅此而已 - &&s 是一个好主意,可以保护您,以防万一出现问题。


    如果您在遵循此建议时遇到问题,请发表评论。 git 搞砸是很难解开的,所以我们至少能做的就是尽量不要重新发明the wheel

    【讨论】:

    • 请不要建议删除本地存储库中的分支,因为它会删除 reflog。最好只重命名分支:git checkout master; git branch -m main; git branch --set-upstream-to origin/main.
    • @j6t 您指的是What your collaborators/colleagues need to do 部分下方的脚本,对吗?我假设它只删除了一个名称,因为新签出的main 拥有过去在master 上的完整历史记录。无论如何,如果您的版本只是实现相同目标的一种更安全的方式,那么我会很乐意使用您的版本。你能帮我确认一下吗?
    • 是的,合作者的脚本。但是不,删除分支不仅会影响名称,还会影响 reflog,即分支所在的所有状态,无论它们是否在分支的当前历史记录中。当它被消灭时,历史上没有的状态的恢复变得困难。这可能是也可能不是问题。
    • 我建议合作者运行git fetch origin --prune && git branch -m master main && git branch --set-upstream-to=origin/main main。无论他们在哪个分支上,这都应该有效;如果他们没有名为master 的分支,第二个命令将失败,第三个命令将不会运行,但它们会没事的。
    • 好吧,那就不要本地删除了,重命名就好了。这正是我正在寻找的建议,谢谢。 @torek,我能解释一下--prune 的作用吗,它会摆脱origin/master,还是只是一个好主意?
    【解决方案2】:

    我正在管理一个自托管的 gitlab 实例 (v13.x.y),您不必手动执行此操作 - 与 Arne 为 github 提到的解决方案类似。

    首先,将您的主分支复制到主分支。 然后,进入项目Settings,点击Repository,修改默认分支。

    之后,您可以使用上面的 sn -p 来更新您的本地存储库(如果需要更改分支名称),或者如果您担心可能会搞砸,您可以删除项目并克隆再来一遍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      • 2011-04-12
      • 2011-11-01
      • 2010-12-09
      • 1970-01-01
      • 2021-02-05
      相关资源
      最近更新 更多