Russ Cox (rsc)发现每隔一段时间总会有人示意Go 的首次 commit 是在 1972 年 。rsc认为这种说法显然是十分愚昧的,并分享了对于 Go 版本控制的更多乏味历史。例如: Go 真正首次 commit 是第 5 个 commit,此前的都是假 commit。

% git log --reverse --statcommit 7d7c6a97f815e9279d08cfaea7d5efb5e90695a8Author:     Brian Kernighan <bwk>AuthorDate: Tue Jul 18 19:05:45 1972 -0500Commit:     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(+)...

据rsc 所言,Go 应用过的版本控制系统共有 4 个:Subversion、Perforce、Mercurial 、Git。

commit 18c5b488a3b2e218c0e0cf2a7d4820d9da93a554Author:     Robert Griesemer <gri@golang.org>AuthorDate: Sun Mar 2 20:47:34 2008 -0800Commit:     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(+)

Subversion

Go 开始应用 Subversion 是作为评估Subversion在Google外部推广应用的可行性试验,尽管最初没有抉择 Subversion,但正是 Go 真正首次 commit提交到了 SVN 服务器。

Perforce

2008 年 7 月,Go 在 Subversion提交了最初一次 commit 。尔后转向 Perforce,Go 开源前的大部分开发工作都是在 Perforce 上进行。

上面是 Go 迁徙到 Perforce 的首次 commit:

commit 777ee7163bba96f2c9b3dfe135d8ad4ab837c062Author:     Rob Pike <r@golang.org>AuthorDate: Mon Jul 21 16:18:04 2008 -0700Commit:     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 05caa7f82030327ccc9ae63a2b0121a029286501Author:     Rob Pike <r@golang.org>AuthorDate: Mon Jul 21 17:10:49 2008 -0700Commit:     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命令中创立和提交的,没有通过审核。

commit c1f5eda7a2465dae196d1fa10baf6bfa9253808aAuthor:     Rob Pike <r@golang.org>AuthorDate: Mon Jul 21 18:06:39 2008 -0700Commit:     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(-)

Mercurial

2009 年 10 月,Go 的版本控制系统迁徙到Mercurial,作为11月开源Go筹备工作的一部分。

commit 942d6590d9005f89e971ed5af0374439a264a20eAuthor:     Kai Backman <kaib@golang.org>AuthorDate: Fri Oct 23 11:03:16 2009 -0700Commit:     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 b74fd8ecb17c1959bbf2dbba6ccb8bae6bfabeb8Author:     Kai Backman <kaib@golang.org>AuthorDate: Fri Oct 23 12:43:01 2009 -0700Commit:     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(-)

Git

从 2009 年 11 月始终到 2014 年末,因为 Google Code Project Hosting 行将敞开,Go 不得已寻找新的代码托管计划。在钻研了几个选项后,最终抉择应用 Gerrit Code Review, rsc 认为这是 一个十分棒的抉择。

commit 94151eb2799809ece7e44ce3212aa3cbb9520849Author:     Russ Cox <rsc@golang.org>AuthorDate: Fri Dec 5 21:33:07 2014 -0500Commit:     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 258f53dee33b9055ea168cb186f8c076edee5905Author:     David Symonds <dsymonds@golang.org>AuthorDate: Mon Dec 8 13:50:49 2014 +1100Commit:     David Symonds <dsymonds@golang.org>CommitDate: Mon Dec 8 13:50:49 2014 +1100    remove .hgtags. .hgtags | 140 ---------------------------------------------------------------- 1 file changed, 140 deletions(-)commit 369873c6e5d00314ae30276363f58e5af11b149cAuthor:     David Symonds <dsymonds@golang.org>AuthorDate: Mon Dec 8 13:50:49 2014 +1100Commit:     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 f33fc0eb95be84f0a688a62e25361a117e5b995bAuthor:     David Symonds <dsymonds@golang.org>AuthorDate: Mon Dec 8 13:53:11 2014 +1100Commit:     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 26399948e3402d3512cb14fe5901afaef54482faAuthor:     David Symonds <dsymonds@golang.org>AuthorDate: Mon Dec 8 11:39:11 2014 +1100Commit:     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 只是问题跟踪器的次要起源:源代码的官网次要正本位于 go.googlesource.com。

至此,这就是Go转向第五个版本控制系统前的故事。

原文链接:https://research.swtch.com/govcs