什么版本控制系统是最重要的设置和使用的玩具项目?
我在CS部门教授第三个必要的介绍课程。 我的一项家庭作业要求学生加快编写以前作业的代码。 十因子加速是例行公事; 100或1000的因素并不是闻所未闻的。 (对于1000的加速因素,你必须用malloc()做出菜鸟错误。)
程序是通过一个序列改进的小改变。 我要求学生logging和描述每个变化和由此产生的改善。
当你正在改进一个程序时,也可以打破它。 退出是不是很好?
你可以看到我要去的地方:我的学生从版本控制中受益匪浅。 但是有一些警告:
- 我们的计算环境被locking。 任何依赖中央存储库的东西都是可疑的。
- 我们的学生令人难以置信的超载。 不只是class级,还包括工作,运动,音乐,你可以把它命名。 对于他们来说,使用一个新的工具,它必须是非常容易,有明显的好处。
- 我们的学生成对完成大部分工作。 在帐户之间来回访问是有问题的。 这个问题也可以通过分布式版本控制来解决吗?
- 复杂性是敌人。 我知道build立一个CVS存储库太困难了 – 我自己仍然有麻烦,因为我只做一年一次。 我被告知SVN更难。
以下是我对现有系统的评论:
- 我认为中央版本控制(CVS或SVN)已经被排除了,因为我们的学生没有必要的pipe理权限来创build一个可以与其他学生共享的存储库。 (我们坚持使用Unix文件权限。)另外,CVS或SVN上的安装太难了。
- darcs很容易build立,但是如何分享内容并不明显。 darcs发送(通过电子邮件发送补丁)似乎很有前景,但不清楚如何设置它。
- git的入门文档不适合初学者。 就像CVS设置一样,这是我自己遇到的问题。
我正在征求关于什么源代码控制与初学者一起使用的build议。 我怀疑我们可以find资源,把薄薄的单板放在现有的系统上,并简化现有的文档。 我们可能没有资源来编写新的文档。
因此, 与合作伙伴一起设置 , 提交 , 还原和共享变更非常容易,但是并不一定很容易合并或按规模进行工作。
一个关键的约束是编程对必须能够彼此共享工作,而且只能彼此共享,并且每一 对都会变化 。 我们的基础设施是使用netapp文件pipe理器的Linux,Solaris和Windows。 我怀疑我的IT人员想为每一对学生创build一个Unix组。 有没有更容易的解决scheme,我忽略了?
(感谢接受的答案,由于其对Git Magic的极好的参考以及有用的评论而击败了其他人)。
我会说Git可能适合这个法案:
- 因为它是一个分布式系统,所以你不需要有一个中央仓库,这个仓库就是源码目录
- 创build可以邮寄和应用的补丁文件很容易。
- 虽然看起来git很难使用,但是提交,合并,添加和删除文件的基本思想并不难学。
看看这个网站Git Magic ,甚至这个提示网站GitReady
其次selectMercurial
优点
- 优秀的文档。
- graphics视图命令显示分支。
- 跨平台。
- 为所有平台提供GUI(TortoiseHG,或thg)。
- 内置的Web服务器用于查看项目。
- 可以保持你的项目在你的拇指驱动器上。
- 即使只有一个成员记住他们的笔记本电脑,也可以保存工作。 不是那样会发生。
缺点
- 如果不存在,必须安装Python。
- 容易做到,但这是另一个步骤。
- 理解推/拉与更新/提交之间的区别。
- (这对所有分布式VCS都是通用的)。
- 头和小费之间的区别。
- 一些命令不是立即可用的; 他们必须明确启用。
- (这一般认为社区是有利的,因为它使事情变得简单,但也有一些人不同意)。
Subversion易于安装,在Windows,Linux和Mac OS X上。 我不知道他们在编程什么程序,但Eclipse的subclipse插件相当容易安装,并隐藏了一些存储库的复杂性。
和存储库复杂性? 这只是在每个项目中都有一个主干,标签和分支文件夹。 他们可能没有太多时间,但他们应该花时间学习SVN(或类似),因为他们的简历看起来不错。
我build议看看化石 – 这是一个单一的可执行文件,没有依赖运行,通过HTTP操作所有的stream量,保持所有的数据库数据在一个单一的文件,可以命名任何东西,并包括版本控制的维基百科,错误跟踪和networking开箱即用的服务器。 哦,它是完全分布的。
我会build议Mercurial (也称为'hg')。 它是一个分布式的开源VCS,不需要中央仓库。 日常使用很容易。 官方网站上有足够的文档。 例如检查快速入门 。
对我来说,决定点是Windows的一个很棒的GUI – TortoiseHg 。 它似乎也支持Linux(不尝试自己)。 当然,大多数Linux版本都有命令行分发。
当然,从围栏的这一边看起来很容易,也许对于繁忙的学生来说,优点和日常操作不会那么容易习惯。 但最终,即时提交,能够恢复到任何修改,并从那里自动创build一个新的分支,智能差异/合并只是不可替代的。
希望这可以帮助!
为了方便学生使用,您可以安装SVN服务器,开启自动提交function,使用webdav进行共享。 这样,他们可以使用WebDAV挂载他们的目录,并在每次保存时自动提交 – 使用TortoiseSVN,Eclipse / Visual Studio插件或像ViewVC这样的Web访问解决scheme访问历史logging是很容易的。 对于你的访问限制需求,你可以使用集成的颠覆validation(看这里 ) – 它使用一个简单的configuration文件进行细粒度的访问控制。
configuration变得更容易了(现在有更好的文档 – 查看SVN书籍 ),但是如果你需要多个单独的具有访问限制的存储库和Web界面,可能会有点复杂。
Autocommit更适合“我的上class族/老板”,他不知道计算机里面发生了什么,需要对Word文档进行版本控制。 学习编程课程的学生也许还应该学习如何使用体面的SCM。
Git和Mercurial会很好,因为它们的分布式特性使共享变得容易 – 但是这两种工具都缺乏真正易于使用的GUI界面(TortoiseHg看起来很有前途,而gitk是一个很好的Repository浏览器,但是你的学生仍然必须把他们的头围绕命令行工具来充分利用这些工具)。 分布式SCM的概念也要复杂一点。
在亲可以使用公共托pipe解决scheme,如GitHub ,并不会担心服务器设置。 这也使共享解决scheme真的很容易,但会打破你的“只与对方”的要求。 但是,我想你无法阻止他们交换代码,在我的课程工作经验中,我发现查看代码并validation它的唯一性是防止复制的唯一方法。
你也可以使用PlasticSCM ,它为许多IDE提供了非常好的接口,并且(至less是网站声明)为教育机构提供了免费的许可证。
我看不出build立源代码pipe理系统的理由。 查看使用例如谷歌代码和潜水的条款。
一个同伴CS学生,我去年使用它,它的工作很好,唯一的先决条件是互联网连接:-)
Bazaar , Mercurial和Git的声音适合你的情况 – 创build存储库是微不足道的,所有学生需要共享的是对文件系统的读访问权限给对方的存储库。
Darcs是一个很好的DVCS,特别是对于CS类的小项目。 我希望我在大学里被介绍给Darcs或者Git,同时我也推荐你把它介绍给你的学生。
我每天都使用Git。 这是一个非常强大的DVCS,但对于较小的项目可能有点矫枉过正。
拿你的select,这些版本控制系统是非常好的。
darcs send
是微不足道的设置 – 当你运行darcs send <remote repo>
,它在darcs send <remote repo>
_darcs/prefs/email
中查找决定发送邮件的位置。 如果没有什么,那么它会提示用户。
补丁的接收者只保存文件并运行darcs apply <patch file>
在适当的repo中darcs apply <patch file>
。
因此,每个学生可以在_darcs/prefs/email
自己的电子邮件地址发送自己的回购_darcs/prefs/email
并通过电子邮件交换补丁。
我有一些非常好的集市经验。 像Git / Mercurial它是分布式的。 它是无服务器的 – 即使您正在远程访问(即,它可以像FTP / SFTP共享一样工作),也不需要在托pipe存储库的服务器上安装守护程序。
分布式VCS是最灵活的。 您可以从更传统的“中央”存储库中检出分支,并获得能够将自己的小开发分离到中央服务器等的所有好处,然后或许可以将更改推回。
还有其他VCS的导入工具,如Subversion,虽然我还没有尝试过。
关于权限,外部服务不需要你大学的IT人员的时间。
例如, Bitbucket (使用Mercurial)现在允许最多5个用户无限制的私人回购。 我猜测每个新的每周一对学生正在共同开发一个新项目,这意味着他们可以初始化资源库,添加其他用户,然后离开他们。
如果他们不是每周都在为一个新项目工作,那么权限就不得不被删除和添加,我鼓励他们在Bitbucket上有多个回扣(每个账户一个),这样每个学生都可以继续访问。 (无论如何,这将是一个好主意,但是只有一个星期的项目,只要有一个学生账户拥有回购,而另一个获得许可,则可能会更简单。)
对于哪个VCS,我相信Mercurial将会是最好的平台–TortoiseHg对于新用户来说,如果他们不熟悉(而且你没有时间学习)命令行界面,则特别有用。
具体到你的情况,DVCS的优势是他们在大学服务器上的副本(如果有的话)是一个完全成熟的回购。 您可能会发现,您或助教有权访问,这应该是更简单的设置,并将持续整个学期,而不是每周更改。
build立一个Subversion版本库是微不足道的。 我经常把一个小项目设置成一次性的东西(比如开发堆栈溢出的代码),我怀疑任何其他可以学习SCM系统的人都会遇到麻烦。
$ svnadmin create /home/cjs/repo $ mkdir my-project $ cd my-project $ vi hello.c [...hack hack hack...] $ svn import -m 'Initial project import.' file:///home/cjs/repo Adding hello.c Committed revision 1.
也就是说,分享当然是一个问题。 如果学生在同时工作的时候总是一起工作,那么他们可以使用USB驱动器,因为他们只需要拔下电源,然后在需要共享的时候来回传递,而以后要单独编程的人就可以挂到它。 虽然这并不完全方便。
另一个select,因为它们看起来都在共享的Unix系统上工作,所以创build一个目录,为其余的组(或所有的用户)设置执行但不是读取位的目录,并在该目录下使用s3cr3t名称作为回购,只有两个学生知道。 把这个秘密名字传给教授,他也可以随时检查学生的回购。 (“所以你按时提交了作业,但电子邮件系统丢失了吗?让我看看那个提交的时间….”)一个脚本可以帮助设置这个。
事实上,我越想越想越喜欢它。 在某些方面,它比git解决scheme更简单,因为学生不必处理周围的补丁(或者忘记这么做),学生在提交之前将不得不处理合并,而不是一旦发生事情(随后有能力无限期地延迟处理)。
更新:六年后,我再也不会考虑使用颠覆。 Git是要走的路。 所以,虽然我仍然认为SVN有点“简单”,但它甚至不值得教学了。
我已经使用了CVS,SVN,Bazaar和Git(按照引入的顺序),我不得不对学生说SVN是要走的路。 事实上,在我担任主pipe助理的时候,我们实现了SVN来代替旧的“提交脚本”,这是一个tar和电子邮件脚本。 Labstaff设置一个基于Apache SVN-DAV的仓库,使用authz文件,助教和讲师可以控制每个学生目录和组项目的权限,使得学生可以通过非常简单的方式进行第一次提交。 看我的教程 (最近的TA撕下的凭证..嗯..)
关于在不受系统pipe理员干预的情况下使用颠覆,我在一个小组项目设置中也做了这个,在这个设置中,我的小组成员之前从来没有使用颠覆过,而且大多数人都犯了一点混乱(除了一个之外) 。 我还写了一个教程, 在这里只用基本的SSH访问来设置这样一个安全的共享库。
我绝对不同意 git是初学者最好的VCS,在提及任何VCS系统的时候,都经历过空白的外观,更不用说Mac-daddy写的Linus自己的VCS王git了。 git并不比svn复杂,仅仅缺乏成熟的n00b工具就足以成为在这种情况下不使用它的原因。 我刚刚开始使用git来开发一个在Netbeans中开发的新项目,并已经在Netbeans集成中遇到了严重的限制。 在一个学期你不会使用svn没有提供的任何function,所以git是矫枉过正的。
Windows上的Subversion可以像设置TortoiseSVN一样简单。 使用它有一些学习曲线(特别是如果你以前从未使用过版本控制的话),但是你也许可以通过专门学习半节课程并提供一些幻灯片供他们下载。
至于集中 – 我听说过提供免费SVN项目托pipe的网站。 一个快速的谷歌search出现在这个页面,但肯定还有更多。
如果你正在寻找一些真正意义上的设置,那么为什么不去免费的SVN托pipe选项,你不必设置一个东西!
可悲的是,每个人都会指出你是Assembla,Unfuddle的两个较旧的,已经放弃了对他们免费托pipe的支持(或者如果你想让他们私有的话),但是你仍然可以使用Origo这个开放和封闭的托pipe。
这样做的好处是你可以拥有所有的项目并且全部跟随他们,轻松地控制有权访问的人,而且你不必担心创build回购站的权利。
如果你走这条路线,而你想消除复杂性,那么你必须使用一个GUI svn应用程序,使学习接近琐碎(因为我怀疑将会有很多合并进行)。 我会推荐tortoisesvn ,滑入您的Windows资源pipe理器上下文菜单。
我会说你最好的select就是尝试与你的IT部门合作,为你的学生build立一个系统/方法,以便轻松地创build新的SVN / CVS存储库。
也许你可以让IT部门为你的学生提供创build知识库所需的特权,即使他们不会把这些知识交给学生自己。 在学期开始的时候,你可以很容易地写一些脚本来从学生列表中大量创build存储库。
RCS for Linux。
我发现没有比RCS更简单的Widows,但并不是所有的RCS端口都能正常工作,所以你必须尝试一下,这样做非常简单。 Windows对于开发人员来说并不简单。 从http://www.cs.purdue.edu/homes/trinkle/RCS/的Windows端口是相当不错的。;