Go 的版本控制歷史:始於 SVN,鍾於 Git

2022-02-18 09:00:07

Go 開發團隊技術 leader Russ Cox (rsc) 介紹了關於 Go 的版本控制歷史。起因是每隔一段時間,總有人用下面這段程式碼錶示 Go 的首次 commit 是在 1972 年:

% 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(+)

...

rsc 認為這種說法十分愚蠢,於是他揭祕了關於 Go 版本控制的更多有趣歷史,比如 Go 真正的首次 commit 其實是第 5 個 commit,在此之前的是假 commit。

commit 18c5b488a3b2e218c0e0cf2a7d4820d9da93a554
Author:     Robert Griesemer <[email protected]>
AuthorDate: Sun Mar 2 20:47:34 2008 -0800
Commit:     Robert Griesemer <[email protected]>
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 個:SVN、Perforce、Mercurial 和 Git

SVN

Go 剛啟動的時候使用 SVN 作為版本控制系統,據稱這是因為谷歌希望通過此舉評估在內部大規模推廣 SVN 的可行性。最後的結果雖然沒有選擇 SVN,但上文提到的正是提交到了 SVN 伺服器,可以說 SVN 見證了 Go 的誕生。

Perforce

2008 年 7 月,Go 在 SVN 提交了最後一次 commit,此後便轉用 Perforce。

下面是 Go 遷移到 Perforce 的首次 commit:

commit 777ee7163bba96f2c9b3dfe135d8ad4ab837c062
Author:     Rob Pike <[email protected]>
AuthorDate: Mon Jul 21 16:18:04 2008 -0700
Commit:     Rob Pike <[email protected]>
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 <[email protected]>
AuthorDate: Mon Jul 21 17:10:49 2008 -0700
Commit:     Rob Pike <[email protected]>
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=,:

commit c1f5eda7a2465dae196d1fa10baf6bfa9253808a
Author:     Rob Pike <[email protected]>
AuthorDate: Mon Jul 21 18:06:39 2008 -0700
Commit:     Rob Pike <[email protected]>
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(-)

Go 在開源前的大部分開發工作都是在 Perforce 伺服器上進行。

Mercurial

,Go 的版本控制系統開始切換至 Mercurial:

commit 942d6590d9005f89e971ed5af0374439a264a20e
Author:     Kai Backman <[email protected]>
AuthorDate: Fri Oct 23 11:03:16 2009 -0700
Commit:     Kai Backman <[email protected]>
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 <[email protected]>
AuthorDate: Fri Oct 23 12:43:01 2009 -0700
Commit:     Kai Backman <[email protected]>
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(-)

這次的切換也是屬於 11 月開源 Go 的準備工作的一部分,開發團隊還需要將新的開源版權宣告新增到每個檔案中。rsc 表示這些工作花費了他大約一週的時間。

Git

從 2009 年 11 月到 2014 年底,由於 Google Code Project Hosting 即將關閉,Go 也不得不尋找新的程式碼託管方案。在研究了幾個選項後,他們最終選擇使用 。許多人認為 Go 託管在 GitHub 上,但 GitHub 只是問題跟蹤器的主要來源:原始碼的官方主要副本位於 。

下面的 commit 見證了 Go 從 Mercurial 到 Git 的轉換:

commit 94151eb2799809ece7e44ce3212aa3cbb9520849
Author:     Russ Cox <[email protected]>
AuthorDate: Fri Dec 5 21:33:07 2014 -0500
Commit:     Russ Cox <[email protected]>
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 <[email protected]>
AuthorDate: Mon Dec 8 13:50:49 2014 +1100
Commit:     David Symonds <[email protected]>
CommitDate: Mon Dec 8 13:50:49 2014 +1100

    remove .hgtags.

 .hgtags | 140 ----------------------------------------------------------------
 1 file changed, 140 deletions(-)

commit 369873c6e5d00314ae30276363f58e5af11b149c
Author:     David Symonds <[email protected]>
AuthorDate: Mon Dec 8 13:50:49 2014 +1100
Commit:     David Symonds <[email protected]>
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 <[email protected]>
AuthorDate: Mon Dec 8 13:53:11 2014 +1100
Commit:     David Symonds <[email protected]>
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 <[email protected]>
AuthorDate: Mon Dec 8 11:39:11 2014 +1100
Commit:     David Symonds <[email protected]>
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 <[email protected]>

 .gitignore | 1 +
 1 file changed, 1 insertion(+)

展開閱讀全文