适用于小型项目的轻量级版本控制(原型,演示和一次性)

时间:2009-10-21 22:38:52

标签: visual-studio visual-studio-2008 version-control

背景

我从事过很多小项目(原型,演示,一次性等)。它们主要用Visual Studio编写(WPF或ASP.NET,代码用C#编写)。通常,我是唯一的编码员。偶尔,我和另一个人一起工作。项目来来往往,通常只需几个月,但我有一套不断发展的公共代码库,我可以重复使用。

问题

我之前尝试使用源代码控制软件(SourceGear Vault),但是在处理一个小项目时似乎需要很多开销,特别是当我是唯一的程序员时。不过,我想要版本控制提供的一些功能。

以下是我想要的功能列表:

  1. 让我立即查看项目旧版本中的任何文件。请不要强迫我完成以下工作:(1)检查我当前的工作,(2)将我的本地副本还原为旧版本,以及(3)检查当前版本,以便我可以再次处理它。
  2. 事实上,如果我是项目中唯一一个,我不想退房。我唯一想做的就是说:“请保存我现在拥有的版本2.5。”
  3. 有效存储我的数据。如果我的项目中有100 Mb的媒体,我不希望复制我发布的每个新版本。只复制更改内容。
  4. 让我将我的常用库代码文件保存在硬盘上的一个位置,这样我所有当前的项目都可以从我对库中的任何错误修复或改进中受益。我不想每次做出改变时都要将我的库复制到其他项目中。
  5. 然而,让我回到任何项目的任何版本,看看当时的源代码(包括库代码)是什么样的版本已发布。
  6. 请不要让我在我的机器上存储一个特殊的数据库服务器,这使我的计算机在我甚至不编程时需要更长的时间来启动和/或使用资源。
  7. 这是否存在?

    如果没有,我能有多接近?

    编辑1:TortoiseSVN展示次数

    我做了一些Subversion实验。几点意见:

    1. 一旦你检查了存储库中的内容,它就会对你的文件产生影响。它将这些隐藏的.svn文件夹放在项目文件夹中。它与文件夹图标混淆。我还没有让我的项目恢复“正常”。 Unversion a working copy让我在那里的一部分,但我仍然有蓝色问号图标的文件夹。这让我脾气暴躁: - / 更新:最后通过手动创建新文件夹并复制文件夹来摆脱文件夹图标。 (不好。)

    2. 我安装了Visual Studio(AnkhSVN)的开源插件。在我的硬盘驱动器中创建一个新的存储库后,我尝试从Visual Studio中检入解决方案。它确实让我害怕它会做的事情。它仅检查了 我的解决方案文件夹中物理上的文件夹和文件(来自文件系统的POV)。为了完成上面的第5项,我需要解决方案使用的所有源代码都要签入。我试图手动执行此操作,但它不是一个用户友好的过程(一方面,当我选择多个库项目时立即尝试检查它们,它似乎只检查了第一个)。然后,当我尝试检查后续项目时,我开始收到错误对话框。

    3. 所以,此时我对SVN(及其支持软件)感到有点沮丧。

      编辑2:TortoiseHG印象

      我现在正在尝试Mercurial(TortoiseHG)。起初有点难以弄清楚,没有比我说的TortoiseSVN更好或更差。我在启动时注意到了一个RPC服务器(与项目 6 相关)。如果我没有与任何人分享任何内容,我认为应该可以关闭它,但这不是我可以通过查看选项来解决的问题(稍后会查看帮助)。

      我很欣赏将我的本地存储库只作为一个.hg文件夹。并且,简单地将文件夹放在回收站中似乎就是我需要做的就是将所有内容恢复正常(即,取消我的项目)。当我签入(提交)时,它似乎只提供一个简单的注释窗口。我想也许会有一个放置版本号的地方。

      我(可能不是很聪明)尝试添加Windows快捷方式(别名我的库项目的文件夹)失败了,而不是我真的认为它会工作:)我想也许这将是一个偷偷摸摸的方式来获取我的库项目(目前位于其他地方)包含在存储库中。但不是。也许我会尝试“subrepos”,但该功能正在建设中。所以,如果没有一些手动同步,我将能够执行 4 5 项目。

9 个答案:

答案 0 :(得分:7)

任何分布式源代码管理解决方案似乎都符合您的要求。请查看bazaargit或mercurial(已在上文提到)。我个人从v0.92开始就一直在使用集市,没有投诉。

编辑:哎呀,再看一遍后,我很确定这3个解决方案中的任何一个都可以处理你所要求的所有6个功能。

答案 1 :(得分:5)

我认为Fog Creek的新产品Kiln会让你非常接近。针对您的具体要点:

  1. 这可以通过网络界面轻松完成 - 您无需触摸本地副本或更新。只需找到所需的文件,单击要查看的修订版,代码就会出现在您面前。
  2. 我不确定你能做什么完全就像“请保存为2.5版本”,但你可以为变更集添加唯一标签,以便你识别特殊版本(其中“特殊” “对你来说意味着什么。”
  3. Mercurial已经做得很好(窑在后端使用),所以在这方面不应该有任何问题。
  4. 通过创建不同的存储库,您可以轻松拥有一个中央“核心”部分,该部分在各个项目中保持一致(尽管我不完全确定这是否是您所说的)。
  5. 我认为大多数版本控制系统都允许你这样做......
  6. Kiln是托管的,所以对本地计算机的性能没有任何影响。您提交给系统的代码保留safe and secure
  7. 最重要的是,Kiln可以通过他们的Student and Startup Edition免费获得最多两个许可证(这也可以获得FogBugz的免费副本)。

    Kiln现在正处于公开测试阶段 - 您可以在我的第一个链接上请求您的帐户 - 并且随着越来越多的问题已经解决,用户被释放。 (有关当前测试版用户所说的内容的一些想法,请查看致力于反馈的Kiln Knowledge Exchange网站。)

    (完全披露:我是一名目前在Fog Creek工作的实习生)

答案 2 :(得分:5)

分布式版本控制系统(Mercurial,Bazaar,Git)很不错,因为它们可以完全自包含在工作副本顶部的单个目录(.hg,.bzr,.git)中,Subversion使用除了工作副本的每个目录中的.svn目录外,还有一个单独的存储库目录。

Mercurial和Subversion可能是最容易在Windows上使用的,使用TortoiseHG和TortoiseSVN; Bazaar GUI也在不断改进。显然还有TortoiseGit,虽然我没有尝试过。如果您喜欢命令行,Easy Git似乎比标准的git命令更好用。

我想更详细地讨论第4点,公共库。不幸的是,我认为它们中的任何一个都不会太容易使用,因为我不认为它们是由GUI直接支持的(我可能是错的)。我实际上在实践中使用的唯一一个是Subversion Externals。

颠覆在这项工作上相当不错;你可以使用Externals(参见SVN书中的章节),但要将项目的版本与库的版本相关联,你需要在外部定义中“固定”库版本(它本身是版本的,作为属性的目录)。

Mercurial支持类似的东西,但两种解决方案似乎都不成熟:最新版本内置的子存储库支持和“Forest Extension”。

Git有“子模块”支持。

不幸的是,我还没有看到像Bazaar的子存储库或子模块这样的东西。

答案 3 :(得分:4)

根据您的要求,我建议subversion

  

让我立即查看旧版本项目中的任何文件。请不要强迫我完成以下工作:(1)检查我当前的工作,(2)将我的本地副本还原为旧版本,以及(3)检查当前版本,以便我可以再次处理它。

您可以使用Tortoise Svn的存储库浏览器轻松导航到每个现有版本。

  

事实上,如果我是项目中唯一一个,我不想退房。我唯一想做的就是说:“请保存我现在拥有的版本2.5。”

这是由svn copy . svn://localhost/tags/2.5完成的。

  

有效存储我的数据。如果我的项目中有100 Mb的媒体,我不希望复制我发布的每个新版本。只复制更改内容。

以颠覆为主。

  

让我将我的公共库代码文件保存在硬盘上的一个位置,这样我所有当前项目都可以从我对库中的任何错误修复或改进中受益。我不想每次做出改变时都要将我的库复制到其他项目中。

     

但是,让我及时回到任何项目的任何版本,看看在发布版本时源代码(包括库代码)的样子。

将您的库放入与其余代码相同的svn存储库中,并且您将拥有全局修订号以将所有库切换回公共状态。

  

请不要让我在我的机器上存储一个特殊的数据库服务器,这使我的计算机在我甚至不编程时需要更长的时间来启动和/或使用资源。

您只需启动svnserve即可启动本地服务器。如果您只在一台机器上工作,您甚至可以不使用它,直接使用您的存储库。

答案 4 :(得分:3)

我会说Mercurial和TortoiseHg会做你想要的。当然,既然你似乎并不需要太多,那么使用TortoiseSvn的颠覆应该同样有效,如果你只是单独工作,虽然我认为mercurial更适合合作。

答案 5 :(得分:2)

水银:

  1. hg cat --rev 2.5 filename(或TortoiseHg中的“Annotate Files”)
  2. hg commit ; hg tag 2.5
  3. Mercurial存储(压缩)差异(和“关键帧”,以避免连续应用一万个差异来查找文件的版本)。除非您使用大型二进制文件,否则它非常有效。
  4. 将库符号链接到所有项目中?
  5. 好的,现在我读到了这一点,我认为Mercurial的Subrepos更接近你想要的。使您的库成为存储库,然后将其作为子库存储在每个项目中。当您的库更新时,您需要在子版本中hg pull更新它,不幸的是。但是当你在一个项目中提交时,Mercurial会记录库repo的状态,这样当你稍后查看这个版本时,看看它会是什么样的,你将得到正确版本的库代码。
  6. Mercurial不这样做,它将数据存储在文件中。

答案 6 :(得分:2)

看看化石,它的单个exe文件。 http://www.fossil-scm.org

答案 7 :(得分:0)

正如人们所指出的那样,几乎任何DVCS都可能为你提供很好的服务。我想我会提到Monotone,因为线程中没有提到它。它使用单个二进制文件(mtn.exe),并将所有内容存储为SQLite数据库文件,除了顶层的_MTN目录外,实际工作区中根本没有任何内容(如果要忽略文件,则为.mtn-ignore)。为了让您快速品尝,我已经将mtn命令显示出如何执行您的愿望清单:

  1. 让我立即查看旧版本项目中的任何文件。 mtn cat -r t:1.8.0 readme.txt

    • 请保存我现在的版本2.5 mtn tag $(mtn automate heads) 2.5

    • 有效存储我的数据。 单调使用xdelta仅保存差异,使用zlib压缩增量(以及每个文件的第一个版本,当然没有增量)。

    • 让我将我的常用库代码文件保存在硬盘上的一个位置,以便我当前所有项目都能从我对库中的任何错误修复或改进中受益。 Montone明确支持这一点;引用手册“merge_into_dir的目的是允许项目包含另一个项目,以便propagate可以用来使所包含的项目保持最新。它旨在取代在许多情况下使用嵌套检验。“

    • 但是,让我及时回到任何项目的任何版本,看看在发布版本时源代码(包括库代码)的样子。 mtn up -r t:1.8.0

    • 请不要让我在我的机器上存储特殊的数据库服务器 就你而言,SQLite可以是磁盘上Monotone存储内容的单个文件。没有额外的进程或启动疯狂(嵌入了SQLite,并且在与Monotone的其余部分相同的进程中直接运行) ,您可以随意忽略这样一个事实,即您可以使用标准工具(如sqlite命令行程序或Python或Ruby脚本)查询和操作Monotone存储库。

答案 8 :(得分:-2)

试试GIT。网上有很多关于它的积极评论。