一条 Git 提交记录引发的 Go 故事

polaris · · 830 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

大家好,我是 polarisxu。 前段时间,我写过一篇文章:[惊呆了!Go 代码的第一次提交竟然是 1972 年。。。](https://mp.weixin.qq.com/s/LlX1a2DoaYjTEChc7Dbyqg) 最近,Go 社区又有其他伙伴提起这事,而且 Russ Cox (rsc) 发现每隔一段时间总会有人提到这个 1972 年。 最近 rsc 终于忍不住发话了:专门在自己的博客撰文分享了 Go 的版本控制历史。以下是该文的内容提要。 首先,rsc 认为 Go 第一次代码提交是 1972 年的说法显然是不可能的,同时还透露了关于 Go 版本控制的更多有趣历史。例如:Go 真正首次 commit 是第 5 个 commit,此前的都是假 commit。 ```bash % git log --reverse --stat commit 7d7c6a97f815e9279d08cfaea7d5efb5e90695a8 Author: Brian Kernighan <bwk> AuthorDate: Tue Jul 18 19:05:45 1972 -0500 Commit: Brian Kernighan <bwk> CommitDate: Tue Jul 18 19:05:45 1972 -0500 hello, world R=ken DELTA=7 (7 added, 0 deleted, 0 changed) src/pkg/debug/macho/testdata/hello.b | 7 +++++++ 1 file changed, 7 insertions(+) ... ``` 以上是第 1 次提交,假的;以下是第 5 次提交,这才是真实的。 ```bash commit 18c5b488a3b2e218c0e0cf2a7d4820d9da93a554 Author: Robert Griesemer <gri@golang.org> AuthorDate: Sun Mar 2 20:47:34 2008 -0800 Commit: Robert Griesemer <gri@golang.org> CommitDate: Sun Mar 2 20:47:34 2008 -0800 Go spec starting point. SVN=111041 doc/go_spec | 1197 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1197 insertions(+) ``` 实际上,Go 使用过的版本控制系统共有 4 个:Subversion、Perforce、Mercurial 、Git。下面逐一简单介绍下。 ## 1、Subversion Go 开始使用 Subversion 是作为评估 Subversion 在 Google 内部推广使用的可行性实验,虽然最后没有选择 Subversion,但 Go 真正首次 commit 提交就是用的 SVN 服务器。 ## 2、Perforce 2008 年 7 月,Go 在 Subversion 提交了最后一次 commit 。此后转向 Perforce,Go 开源前的大部分开发工作都是在 Perforce 上进行。 下面是 Go 迁移到 Perforce 后的首次 commit: ```bash commit 777ee7163bba96f2c9b3dfe135d8ad4ab837c062 Author: Rob Pike <r@golang.org> AuthorDate: Mon Jul 21 16:18:04 2008 -0700 Commit: Rob Pike <r@golang.org> CommitDate: Mon Jul 21 16:18:04 2008 -0700 map delete SVN=128258 doc/go_lang.txt | 6 ++++++ 1 file changed, 6 insertions(+) commit 05caa7f82030327ccc9ae63a2b0121a029286501 Author: Rob Pike <r@golang.org> AuthorDate: Mon Jul 21 17:10:49 2008 -0700 Commit: Rob Pike <r@golang.org> CommitDate: Mon Jul 21 17:10:49 2008 -0700 help management of empty pkg and lib directories in perforce R=gri DELTA=4 (4 added, 0 deleted, 0 changed) OCL=13328 CL=13328 lib/place-holder | 2 ++ pkg/place-holder | 2 ++ src/cmd/gc/mksys.bash | 0 3 files changed, 4 insertions(+) ``` 在转向到 Perforce 后,引入了 DELTA=, OCL= 和 CL= 这些标签。并且许多其他变更具有相同的 OCL= 和 CL=,因为它们是在单个 Perforce 命令中创建和提交的,没有经过审核。 ```bash commit c1f5eda7a2465dae196d1fa10baf6bfa9253808a Author: Rob Pike <r@golang.org> AuthorDate: Mon Jul 21 18:06:39 2008 -0700 Commit: Rob Pike <r@golang.org> CommitDate: Mon Jul 21 18:06:39 2008 -0700 change date OCL=13331 CL=13331 doc/go_lang.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) ``` ## 3、Mercurial 2009 年 10 月,Go 的版本控制系统迁移到 Mercurial,为 11月开源 Go 做准备。 ```bash commit 942d6590d9005f89e971ed5af0374439a264a20e Author: Kai Backman <kaib@golang.org> AuthorDate: Fri Oct 23 11:03:16 2009 -0700 Commit: Kai Backman <kaib@golang.org> CommitDate: Fri Oct 23 11:03:16 2009 -0700 one more argsize fix. we were copying with the correct alignment but not enough (duh). R=rsc APPROVED=rsc DELTA=16 (13 added, 0 deleted, 3 changed) OCL=36020 CL=36024 src/cmd/5g/ggen.c | 2 +- test/arm-pass.txt | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) commit b74fd8ecb17c1959bbf2dbba6ccb8bae6bfabeb8 Author: Kai Backman <kaib@golang.org> AuthorDate: Fri Oct 23 12:43:01 2009 -0700 Commit: Kai Backman <kaib@golang.org> CommitDate: Fri Oct 23 12:43:01 2009 -0700 fix build issue cause by transition to hg R=rsc http://go/go-review/1013012 src/make-arm.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) ``` ## 4、Git 从 2009 年 11 月一直到 2014 年末,由于 Google Code Project Hosting 即将关闭,Go 不得已寻找新的代码托管方案。在研究了几个选项后,最终选择使用 Gerrit 作为 Code Review, rsc 认为这是 一个非常棒的选择。 ```bash commit 94151eb2799809ece7e44ce3212aa3cbb9520849 Author: Russ Cox <rsc@golang.org> AuthorDate: Fri Dec 5 21:33:07 2014 -0500 Commit: Russ Cox <rsc@golang.org> CommitDate: Fri Dec 5 21:33:07 2014 -0500 encoding/xml: remove SyntaxError.Byte It is unused. It was introduced in the CL that added InputOffset. I suspect it was an editing mistake. LGTM=bradfitz R=bradfitz CC=golang-codereviews https://golang.org/cl/182580043 src/encoding/xml/xml.go | 1 - 1 file changed, 1 deletion(-) commit 258f53dee33b9055ea168cb186f8c076edee5905 Author: David Symonds <dsymonds@golang.org> AuthorDate: Mon Dec 8 13:50:49 2014 +1100 Commit: David Symonds <dsymonds@golang.org> CommitDate: Mon Dec 8 13:50:49 2014 +1100 remove .hgtags. .hgtags | 140 ---------------------------------------------------------------- 1 file changed, 140 deletions(-) commit 369873c6e5d00314ae30276363f58e5af11b149c Author: David Symonds <dsymonds@golang.org> AuthorDate: Mon Dec 8 13:50:49 2014 +1100 Commit: David Symonds <dsymonds@golang.org> CommitDate: Mon Dec 8 13:50:49 2014 +1100 convert .hgignore to .gitignore. .hgignore => .gitignore | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) commit f33fc0eb95be84f0a688a62e25361a117e5b995b Author: David Symonds <dsymonds@golang.org> AuthorDate: Mon Dec 8 13:53:11 2014 +1100 Commit: David Symonds <dsymonds@golang.org> CommitDate: Mon Dec 8 13:53:11 2014 +1100 cmd/dist: convert dist from Hg to Git. src/cmd/dist/build.c | 100 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 59 insertions(+), 41 deletions(-) commit 26399948e3402d3512cb14fe5901afaef54482fa Author: David Symonds <dsymonds@golang.org> AuthorDate: Mon Dec 8 11:39:11 2014 +1100 Commit: David Symonds <dsymonds@golang.org> CommitDate: Mon Dec 8 04:42:22 2014 +0000 add bin/ to .gitignore. Change-Id: I5c788d324e56ca88366fb54b67240cebf5dced2c Reviewed-on: https://go-review.googlesource.com/1171 Reviewed-by: Andrew Gerrand <adg@golang.org> .gitignore | 1 + 1 file changed, 1 insertion(+) ``` 许多人认为 Go 托管在 GitHub 上,但 GitHub 主要用于 issue 跟踪:源代码的官方代码在 go.googlesource.com,GitHub 上的是副本,因此 GitHub 上是不支持 PR 的。 至此,这就是 Go 转向第五个版本控制系统前的故事。一件小事,都被大家挖出来,弄得大佬花时间耐心解释! 更详细的故事,请查看 rsc 的博文:<https://research.swtch.com/govcs>。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

830 次点击  
加入收藏 微博
1 回复  |  直到 2022-02-21 08:55:48
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传