最近,世界上出现了一股推动变革的力量。具体来说,在技术行业,人们一直在努力改变我们的说辞,使其更具包容性和可及性。
现在,由于这是一个技术博客,我将避免在这里分享我的观点(尽管如果你联系我,我很乐意在另一个场合讨论)。这篇博文将涉及业界正在做出改变的一个地方:git默认分支命名。
自从我使用git以来,默认的分支名称一直是 "master"。可以说,这是一个非包容性的术语,这也是许多人正在改变其默认分支的原因。事实上,许多组织正在改变他们的工具,使包容性命名成为标准。
例如,软件自由保护协会(Software Freedom Conservancy)曾对分支命名说过。
"我们支持并鼓励项目改用有意义和有包容性的分支名称,我们将为Git增加功能,使新项目使用不同的默认名称更加容易。
沿着这些思路,GitHub已经创建了一个仓库,以明显地跟踪他们网站上的分支命名工具的进展。
分支名称到底是什么?
假设你现在已经决定重命名你的默认分支,下一个任务就是选择正确的名字。但是怎么做呢?
许多人都会认识到威廉-莎士比亚《罗密欧与朱丽叶》中朱丽叶的名言。
"名字有什么用?我们称之为玫瑰的东西
,用任何其他的名字都会有同样的香味;
,如果罗密欧不被称为罗密欧,
,保留他所欠的亲爱的完美
,没有这个称号。罗密欧,放弃你的名字吧,
,为了那个不属于你的名字,
,把我自己全部带走。"
如果你允许我把朱丽叶的比喻应用到这个现代背景中。我想说的是,只要支部的新名字具有包容性和可及性,就不那么重要。无论名称如何,它都能达到默认git分支的目的。
也就是说,我(和我的团队)选择使用main 作为我们仓库的默认分支。这个决定的主要原因是与其他人的决定和我们使用的工具一致。
具体来说,GitHub曾说过。
"main是我们在GitHub上看到的最流行的master的替代品。我们喜欢它,因为它很短,可以保持你的肌肉记忆,而且在大多数语言中都能很好地翻译。我们对新创建的仓库和正在转移的仓库都使用main,比如dependabot-core"。
因此,本篇文章中的所有例子都将假设main 为新的默认分支,但请随意用你选择的任何名称来替换它。
技术上的影响是什么?
正如大多数技术专家所发现的那样,在软件中重新命名事物,很少是想一个新的名字和改变我们的声音修辞那么简单。这往往涉及到技术上的副作用。
根据你的情况,这个列表可能并不完整;但是,这些是我们发现在重命名过程后需要改变的地方。
- 本地开发机器
- 拉动请求
- 储存库的分叉
- CI管道
- CD管线
- 贡献者的入职脚本
- 自动化工具集
- 文档
重命名的过程是怎样的?
Steven Mortimer写了一篇精彩的文章,详细介绍了在git中重命名一个分支的步骤。它构成了我写的脚本的基础,使这个过程在我工作的许多存储库中变得更容易。关于这些步骤的细节,请参考他的文章或看下面的脚本。
但在你自己尝试之前,请注意,如果你使用的是GitHub,自从我的团队第一次尝试之后,他们已经使这个过程变得更加容易了。使用他们网站上的重命名工具,不仅省去了大部分的手动步骤,而且还能处理诸如拉动请求和分叉等事项。这个过程很简单,只要点击分支列表中默认分支旁边的编辑图标,输入一个新名字,然后点击重命名分支。然后按照网站提供的一些手动步骤操作。请看这里的官方文档,或者在这里关注GitHub为改进分支重命名过程所做的工作的状况。
对于那些不使用GitHub的人,这里是我们如约使用的脚本。在这两个脚本之间,你需要登录到你的git服务器,以便。
-
#!/usr/bin/env bash set -x git checkout master remote=$(git remote show) git pull git branch -m master main git push -u $remote main git symbolic-ref \ refs/remotes/$remote/HEAD \ refs/remotes/$remote/main git branch -a#!/usr/bin/env bash set -x remote=$(git remote show) git push $remote :master git remote prune $remote git branch -a
那些副作用怎么办?
处理副作用会因你、你的团队和你的组织所使用的工具而有很大的不同,但这里有一些一般的提示。
CI/CD
在你的CI/CD管线中,寻找明确指定分支名称的地方。例如,在TeamCity中检查VCS Root中的 "默认分支 "设置。在GitLab流水线的代码中,寻找诸如rules,needs,includes,refs 等可能有硬编码分支名称的块。GitLab提供了预定义的变量,如$CI_DEFAULT_BRANCH 和$CI_COMMIT_BRANCH ,使动态处理分支更容易。
脚本
在本地运行的自动化中寻找硬编码的分支名。Makefiles, npm scripts, shell scripts, build scripts, 等等......也许可以调整为使用当前分支或从远程查询默认分支。
文档
阅读你的文档,特别是贡献者的文档。确保新加入项目的人知道在分支策略和分支保护方面应该期待什么。确保前任/其他贡献者知道如何迁移。改变git上和你本地机器上的默认分支,并不能改变其他人机器上的默认分支。我根据GitHub在其网站上重命名一个分支后提供的说明,向其他人提供以下脚本。
#!/usr/bin/env bash
remote=$(git remote show)
git branch -m master main
git fetch $remote
git branch -u $remote/main main
拉取请求/分叉
根据你托管源代码的地方,在改变分支时如何处理拉取请求和分叉,会有很大的不同。如果你只有几个拉取请求/分叉,这可能不是问题,但如果你有大量的拉取请求/分叉,手动更新它们可能是不可能的。如果你使用他们的用户界面工具重命名,GitHub会帮你处理这个问题,但并不是所有的供应商都这样做。我建议先在一个小的/低影响的仓库尝试重命名。或者创建一个只是为了测试行为。
这就是了!
不管你对最近的事件,特别是对重命名分支的立场如何,我希望技术行业能够成为一个欢迎和舒适,但对所有希望学习的人来说又充满挑战和兴奋的环境。此外,我希望这篇文章能够回答你在探索git分支在你的环境、组织等方面所扮演的角色时可能遇到的一些技术问题。