研究!rsc公司

关于编程的想法和链接,通过

RSS(RSS)

Go的版本控制历史记录
发布于2022年2月14日,星期一。

每隔一段时间,就会有人注意到Go回购中的第一笔承诺日期为1972年:

%git日志--reverse--stat提交7d7c6a97f815e9279d08cfaea7d5efb5e90695a8作者:Brian Kernighan作者日期:1972年7月18日星期二19:05:45-0500提交:Brian Kernighan承诺日期:1972年7月18日星期二19:05:45-0500你好,世界R=肯Δ=7(增加7个,删除0个,更改0个)src/pkg/debug/macho/testdata/hello.b |7+++++++1个文件已更改,7次插入(+)...

很明显,有些事情正在发生,人们通常会停下来。但Go的实际版本控制历史更丰富、更有趣。例如,还有几个虚假提交,然后是第五个提交是第一个真正的:

提交18c5b488a3b2e218c0e0cf2a7d4820d9da93a554作者:Robert Griesemer<gri@golang.org>作者日期:2008年3月2日星期日20:47:34-0800提交:Robert Griesemer<gri@golang.org>承诺日期:2008年3月2日星期日20:47:34-0800执行规范起点。SVN=111041文档/go_spec | 1197+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++1个文件已更改,1197个插入(+)

为什么该提交的预告片与三个虚假提交的预兆不同?

颠覆

Go开始使用Subversion,作为一个小实验的一部分进行评估颠覆以在谷歌内部更广泛地使用。实验没有结果在更广泛的Subversion使用中,但是SVN=111041中的标记上面的第一个实际提交在原始Subversion服务器上记录Go提交修订版111041。(子版本按递增顺序分配修订号,服务器是一个小型的monorepo,用于除Go之外的其他几个项目。没有111040个其他Go提交没有完成。)

Perforce公司

SVN标记继续出现在日志中至2008年7月,其中我们看到最后一个SVN提交,然后是一个新表单:

提交777ee7163bba96f2c9b3dfe135d8ad4ab837c062作者:Rob Pike<r@golang.org>作者日期:2008年7月21日星期一16:18:04-0700提交:Rob Pike<r@golang.org>提交日期:2008年7月21日星期一16:18:04-0700地图删除SVN=128258doc/go_lang.txt | 6++++++1个文件已更改,6次插入(+)提交05caa7f82030327ccc9ae63a2b0121a029286501作者:Rob Pike<r@golang.org>作者日期:2008年7月21日星期一17:10:49-0700提交:Rob Pike<r@golang.org>承诺日期:2008年7月21日星期一17:10:49-0700perforce中空pkg和lib目录的帮助管理R=灰度DELTA=4(添加4个,删除0个,更改0个)OCL=13328CL=13328库/位置所有者|2++包装/位置持有人|2++src/cmd/gc/mksys.bash |03个文件已更改,4个插入(+)

这是Go从一个轻量级的将服务器Subversion转换为轻型Perforce服务器。谷歌是一家重度Perforce使用者由于它使用了大多数代码的单个巨型单回购.围棋不是单回购世界的一部分,当时,不必位于负载沉重的主服务器上的项目被托管在次要服务器上。

在向Perforce过渡的过程中,您可以看到信号装置的引入三角洲=,OCL公司=、和CL公司=标签。Perforce在变更列表上强加线性排序,如Subversion修订,但是每个更改列表都有两个序列号:它被分配了一个是当它是本地挂起的更改列表时创建并使用该编号,包括在我们的代码审查系统中。然后,当它被提交并成为官方历史的一部分时,它被分配了一个新的编号,以使提交的更改保持有序。这个OCL公司=是原始更改列表编号,而CL公司=是最后一个。这个R(右)=线条意味着格里(Robert Griesemer)回顾了之前的更改已提交,使用我们的内部代码审查系统,然后称为Mondrian。因为服务器使用得如此之少(大概审查速度也如此之快),没有新的更改列表创建或提交此文件时,此文件处于挂起状态,其最终提交重新使用其原始编号,而不需要创建新编号。

许多其他更改也有相同之处OCL公司=CL公司=因为他们是在单个Perforce命令中创建并提交,无需审查,喜欢下一个:

提交c1f5eda7a2465dae196d1fa10baf6bfa9253808a作者:Rob Pike<r@golang.org>作者日期:2008年7月21日星期一18:06:39-0700提交:Rob Pike<r@golang.org>承诺日期:2008年7月21日星期一18:06:39-0700更改日期OCL=13331CL=13331doc/go_lang.txt | 2+-1个文件已更改,1个插入(+),1个删除(-)

您还可以从中看到三角洲=已添加行由代码审查系统而非Perforce:这个未经审查的更改没有它。(最后两行由git日志--stat命令,因为我们研究这些更改的Git版本。)

Go的大部分开源前开发工作已经完成在Perforce服务器上。

Mercurial公司

这个OCL公司=CL公司=队伍一直排到2009年10月,当他们切换到新表单时:

提交942d6590d9005f89e971ed5af0374439a264a20e作者:Kai Backman<kaib@golang.org>作者日期:2009年10月23日星期五11:03:16-0700承诺:Kai Backman<kaib@golang.org>提交日期:2009年10月23日星期五11:03:16-0700另一个argsize修复。我们正在用正确的对齐但不够(duh)。R=rsc批准=rscDELTA=16(增加13个,删除0个,更改3个)OCL=36020CL=36024src/cmd/5g/ggen.c|2型+-测试/arm-pass.txt | 17+++++++++++++++--2个文件已更改,16个插入(+),3个删除(-)提交b74fd8ecb17c1959bbf2dbba6ccb8bae6bfabeb8作者:Kai Backman<kaib@golang.org>作者日期:2009年10月23日星期五12:43:01-0700承诺:Kai Backman<kaib@golang.org网站>提交日期:2009年10月23日星期五12:43:01-0700修复转换到hg导致的构建问题R=rschttp://go/go-review/1013012src/make-arm.bash | 4++--1个文件已更改,2次插入(+),2次删除(-)

该承诺引入了另一种预告线,上面写着http://go/go-review/1013012.链接指向谷歌内部,到Rietveld App Engine应用程序的内部版本,我们在提交过程中使用它进行代码审查谷歌代码项目托管的私人Mercurial回购。我们在2009年10月进行了转换准备于11月开放源码Go。

就在此时,在转换为Mercurial的过程中,我介绍了“hello,world”承诺。Subversion和Perforce回购是谷歌内部的服务器,我们基本上存储了世界上所有的Go代码与Go实现一起使用。我们每个人都有“用户目录”,比如/用户/rsc回购中。那些目录中包含了各种不可用的代码无论是因为它针对的是谷歌内部或者因为它根本不值得出版。(您仍然可以看到对的引用/用户使用程序在几个提交消息中这确实说明了问题。)

对于转换,我最终得到了一个目录,其中包含了很多补丁,每次提交一个,并使用脚本运行修补程序以创建新的Mercurial存储库。然后我编辑了补丁(在自动帮助下),删除了没有发布,包括整个/用户使用程序树,并在每个文件中添加新的开源版权声明。

这花了我大约一个星期的时间,非常困难。如果我从一些补丁中删除了一个文件,但随后它被重命名了在其他情况下,Mercurial会抱怨使用一个最初没有创建的文件。如果我在创建文件时添加了版权声明,我必须小心更新以后的补丁,以避免更改文件顶部时发生合并冲突。依此类推。我记得当时认为这就像一个构建虚假身份的骗子努力保持一切正常。

你好,世界

一个月前,我创建了对象文件解析包喜欢调试/机械,作为每个包的测试数据签入对象文件编译自一个简单的“hello,world”程序,以及它们的源代码:

提交bf69025825fd2b8e7aac01f27d5c974bd30af542作者:Russ Cox<rsc@golang.org>作者日期:2009年9月18日星期五11:49:22-0700承诺:Russ Cox<rsc@golang.org>提交日期:2009年9月18日星期五11:49:22-0700Mach-O文件读取R=RDELTA=784(添加784,删除0,更改0)OCL=34715CL=34788src/pkg/debug/macho/Makefile | 12+src/pkg/debug/macho/file.go | 374+++++++++++++++++++++src/pkg/debug/macho/file_test.go | 159+++++++++src/pkg/debug/macho/macho.go | 230+++++++++++++src/pkg/debug/macho/testdata/gcc-386-darwin-exec|Bin 0->12588字节src/pkg/debug/macho/testdata/gcc-amd64-darwin-exec|Bin 0->8512字节…/macho/testdata/gcc-amd64-darwin-exec-debug|Bin 0->4540字节7个文件已更改,775个插入(+)

这是最初引入的提交src/pkg/debug/macho/testdata/hello。c(c)当然。当我在文件中添加版权声明时添加版权声明你好。c(c)文件。相反,由于我将回购拆分为这种补丁文件提交形式,很容易创建一些虚假提交,这些提交至少显示了该节目的真实历史,作为一个复活节彩蛋,为那些密切关注的人准备:

提交7d7c6a97f815e9279d08cfaea7d5efb5e90695a8作者:Brian Kernighan作者日期:1972年7月18日星期二19:05:45-0500提交:Brian Kernighan承诺日期:1972年7月18日星期二19:05:45-0500你好,世界R=肯DELTA=7(添加7,删除0,更改0)src/pkg/debug/macho/testdata/hello.b |7+++++++1个文件已更改,7次插入(+)提交0bb0b61d6a85b2a1a33dcbc418089656f2754d32作者:Brian Kernighan作者日期:1974年1月20日星期日01:02:03-0400提交:Brian Kernighan提交日期:1974年1月20日星期日01:02:03-0400转换为CR=dmrDELTA=6(增加0,删除3,更改3)src/pkg/debug/macho/testdata/hello.b |7-------src/pkg/debug/macho/testdata/hello.c |3+++2个文件已更改,3次插入(+),7次删除(-)提交0744ac969119db8a0ad3253951d375eb77cfce9e作者:Brian Kernighan<研究!bwk>作者日期:1988年4月1日星期五02:02:04-0500承诺:Brian Kernighan<研究!bwk>提交日期:1988年4月1日星期五02:02:04-0500转换为建议的ANSI C草案R=dmrDELTA=5(添加2个,删除0个,更改3个)src/pkg/debug/macho/testdata/hello.c |7+++++--1个文件已更改,5次插入(+),2次删除(-)提交d82b11e4a46307f1f1415024f33263e819c222b8作者:Brian Kernighan<bwk@research.att.com>作者日期:1988年4月1日星期五02:03:04-0500提交:Brian Kernighan<bwk@research.att.com>提交日期:1988年4月1日星期五02:03:04-0500最后一分钟修复:转换为ANSI CR=dmrDELTA=3(添加2个,删除0个,更改1个)src/pkg/debug/macho/testdata/hello.c | 4+++-1个文件已更改,3次插入(+),1次删除(-)

这个1972年7月承诺显示了第一个“hello,world”程序,从Brian Kernighan的B语言入门教程”:

主(){外部a、b、c;putchar(a);putchar(b);putchar(c);putchar('!*n');}“地狱”;b’o,w’;c“世界”;

各种网上消息称这是一本“书”,但它绝对不是。这是一份17页的印刷文件,后来作为1973年1月的一半被收录贝尔实验室计算科学技术报告#8:编程语言B(离书还差一点!)。“hello,world”程序出现在第7节,前面是第6节中不太朗朗上口的“嗨!”节目。当我在2022年写这篇博文时,我在网上找不到任何最初日期为1972年7月的B教程参考,但我相信我一定有很好的理由。

这个1974年1月承诺将程序转换为C,如Kernighan的“C语言编程教程”.链接的PDF是Dennis Ritchie的重新打印副本,没有日期,但里奇的“C参考手册“技术备忘录1974年1月15日引用科尼汉的教程为“贝尔实验室,1974年,未出版的内部备忘录”,这意味着教程一定也是在一月份编写的。那个C程序比我们今天习惯了什么,但比B程序好得多:

主(){printf(“hello,world”);}

我跳过了第一版C程序设计语言,它看起来像:

main(){printf(“hello,world\n”);}

这个1988年4月承诺显示了第二版“拟定ANSI C草案”版本的程序C程序设计语言:

#包括<stdio.h>main(){printf(“hello,world\n”);}

这个1988年4月2日承诺显示了我们今天知道的最终完整ANSI C版本:

#包括<stdio.h>整数主要(无效){printf(“hello,world\n”);返回0;}

维基百科称第二版于1988年4月出版。我没有一天的时间,但4月1日似乎合适。我没有时间做这两件事,所以我用02:03:04第二次提交,因此第一次提交为02:02:04。

提交中的电子邮件地址也适用于周期,尽管蒙德里安R(右)=三角洲=标签显然不是:当时没有进行代码审查!

值得一提的是,我后来从很多人那里听说1972年的日期是如何打破各种陈述和他们在Go存储库中所做的分析与其他项目。哎呀!我道歉。(我也听说有人在分析Mercurial回购“branchiness”并决定使用Gorepo作为一个大型测试用例。他们的程序说它有分支0,他们之前花了一段时间调试他们的程序意识到回购实际上是完全线性的,多亏了我们的“重设基础并合并”政策。)

公共Mercurial

我们于2009年11月10日发布了谷歌代码Mercurial回购,为了纪念这个日子,我们又加了一个复活节彩蛋。Brian Kernighan和Rob Pike 1984年著作中的脚注Unix编程环境说:

肯·汤普森(Ken Thompson)曾被问及他会有什么不同如果他正在重新设计UNIX系统系统。他的回答是:“我会拼写创造带有e(电子).”

这是指创建(2)系统调用创建(_C)文件打开标志。

一旦公开发布,肯给我寄了零钱修复此错误:

提交c90d392ce3d3203e0c32b3f98d1e68c4c2b4c49b作者:Ken Thompson<ken@golang.org>作者日期:2009年11月10日星期二15:05:15-0800承诺:Ken Thompson<ken@golang.org>承诺日期:2009年11月10日星期二15:05:15-0800用“e”拼写它R=rschttp://go/go-review/1025037src/pkg/os/file.go |1+1个文件已更改,1个插入(+)

遗憾的是,我们没有完美地执行这个笑话,因为代码审查我们的内部Rietveld服务器,而不是公共服务器。所以下一次提交更新了我们配置中的代码审查服务器。

但对于后代来说,这是我的电子邮件中保存的评论:

吉特

从2009年11月到2014年底,当我们知道谷歌代码项目托管要关门了,我们需要一个新家。在研究了几个选项后,我们最终使用Gerrit代码审查,这是一个很棒的选择。许多人认为Go是在GitHub上托管的,但GitHub只是我们问题跟踪程序的主要功能:源的官方主副本已打开go.googlesource.com网站.

你可以看到从Mercurial到Git的转变R(右)=行结束,后跟一些完全未审查的提交,然后审核人:线条开始:

提交94151eb2799809ece7e44ce3212aa3cbb9520849作者:Russ Cox<rsc@golang.org>作者日期:2014年12月5日星期五21:33:07-0500承诺:Russ Cox<rsc@golang.org>承诺日期:2014年12月5日星期五21:33:07-0500encoding/xml:remove语法错误。字节它是未使用的。它是在CL中引入的,添加了InputOffset。我怀疑这是一个编辑错误。LGTM=布拉德维茨R=布拉德维茨CC=高尔夫方向视图https://golang.org/cl/182580043src/encoding/xml/xml.go |1-1个文件已更改,1个删除(-)提交258f53dee33b9055ea168cb186f8c076edee5905作者:David Symonds<dsymonds@golang.org>作者日期:2014年12月8日星期一13:50:49+1100承诺:David Symonds<dsymonds@golang.org>承诺日期:2014年12月8日星期一13:50:49+1100删除.hgtags。.hgtags | 140个----------------------------------------------------------------1个文件已更改,140次删除(-)提交369873c6e5d00314ae30276363f58e5af11b149c作者:David Symonds<dsymonds@golang.org>作者日期:2014年12月8日星期一13:50:49+1100提交人:David Symonds<dsymonds@golang.org>承诺日期:2014年12月8日星期一13:50:49+1100将.hgignore转换为.gitignore。.hgignore=>.gitignore |9+--------1个文件已更改,1个插入(+),8个删除(-)提交f33fc0eb95be84f0a688a62e25361a117e5b995b作者:David Symonds<dsymonds@golang.org>作者日期:2014年12月8日星期一13:53:11+1100提交人:David Symonds<dsymonds@golang.org>承诺日期:2014年12月8日星期一13:53:11+1100cmd/dist:将距离从Hg转换为Git。src/cmd/dist/build.c | 100++++++++++++++++++++++++++++++---------------------1个文件已更改,59次插入(+),41次删除(-)提交263999948e3402d3512cb14fe5901afaef54482fa作者:David Symonds<dsymonds@golang.org>作者日期:2014年12月8日星期一11:39:11+1100承诺:David Symonds<dsymonds@golang.org>承诺日期:2014年12月8日星期一04:42:22+0000将bin/添加到.gitignore。变更编号:I5c788d324e56ca88366fb54b67240cebf5dced2c审核日期:https://go-review.googlesource.com/1171审核人:Andrew Gerrand<adg@golang.org>.gitignore |1+1个文件已更改,1个插入(+)

作为从Mercurial到Git转换的一部分,我们做到了不向显示旧的Mercurial散列,但我们确实在底层Git提交对象。例如:

%git cat-file-p 7d7c6a97f815e9279d08cfaea7d5efb5e90695a8树e06bd601885e16ad3d72c2a8c9b411889b2e478e作者Brian Kernighan<bwk>80352345-0500委员会成员Brian Kernighan戈朗hg f6182e5bf5eb0c762dddbb18f8854b7e350eaeb你好,世界R=肯DELTA=7(添加7,删除0,更改0)%

这个戈朗-哈格行记录原始Mercurial提交哈希。

故事到此结束,直到我们进入第五个未来某个时候的版本控制系统。