【问题标题】:Replacing the master branch in git and preventing fast forward替换git中的master分支并防止快进
【发布时间】:2012-06-06 18:30:56
【问题描述】:

我在 github 上有一个库,大约一年前,我完全重写了不向后兼容的应用程序。它位于一个名为“结构化”的分支上。 现在大多数安装该库的人都在使用该分支,我想让它成为主控并将当前主控移动到“旧版”。

我不希望旧 master 上的人能够快进到新 master,因为这肯定会破坏他们的应用程序。是否可以将他们转移到遗留分支,或者至少抛出异常并显示一条消息告诉他们签出遗留分支?

【问题讨论】:

标签: git


【解决方案1】:

除非你实现一个钩子,否则我认为这是不可能的,但它可能不值得。

我想我会简单地在我的服务器上克隆存储库,保留旧存储库的原样,在需要时提取错误修复并为新的“结构化”库创建另一个存储库。

【讨论】:

  • 也谢谢丹尼尔。我想那时没有其他办法了。
【解决方案2】:

没有办法转移它们,因为 Git 分支只是标签:没有办法判断新的 master 分支与旧分支有什么不同。

如果客户不希望它破坏它们,我认为从master 分支克隆是一个坏主意。为此,您应该有发布分支或标签,然后人们可以从中克隆,他们会知道他们有一个稳定的分支,该分支只能获得向后兼容的更新(如果是分支)或永远不会更改(如果一个标签)。

至于警告,这也是不可能的,因为当有人从服务器上获取数据时,没有任何钩子可以放在服务器上运行(仅用于推送)。你必须在你的 GitHub 页面上清楚地写出来。

另一个想法是修改master 中的最后一次提交,使其不再是旧master 的快进;并以引起冲突的方式进行。这样一来,每当有老主子拉的时候,他们就会发生冲突,必须检查发生了什么。

【讨论】:

  • 嗯,项目起步很小,随着时间的推移而发展。有一次,我决定该应用程序需要进行重大的设计更改才能继续开发。那时我可能应该创建一个新的 repo 而不仅仅是一个新的分支。因为我知道我永远无法将新分支合并到旧分支。
  • @sbaechler: At that point I should probably have created a new repo instead of just a new branch: 就像我在回答中所说的那样,现在没有什么能阻止你这样做,只需将存储库克隆到服务器中的新存储库,如果你愿意,可以删除旧分支,你就完成了..
【解决方案3】:

至于你问题的“转移”部分,你总是可以做这样的事情作为新主人的第一次提交:

#ifndef IMPLEMENTED_STRUCTURED
#error "The master branch of project x has been completely rewritten and will break legacy applications.  If you are unable to update your application, switch to the legacy branch of this project and your code should continue working as before.  If you want to use the new structured code, simply add a preprocessor definition for IMPLEMENTED_STRUCTURED to get rid of this error message."
#endif

这将阻止任何人的代码成功编译,直到他们阅读消息并决定他们想要采取的行动。

希望如果您不使用 C/C++,您的语言具有可以实现类似行为的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-24
    • 2021-12-05
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2011-12-30
    • 2013-01-14
    • 2016-04-30
    相关资源
    最近更新 更多