将多GB SVN存储库移至Git


13

当前,我的公司在SVN存储库中具有Visual Studio隔离,其组织如下:

SolutionFolder (~3.5 GB)
|-> SolutionName.sln
|-> .. Some source code folders... (~250 MB)
|-> ThirdParty (~3 GB)
|-> Tools
    | -> Tool1
    | -> Tool2

Tool1和Tool2是独立构建的(具有自己的解决方案),但是会生成在主要构建中使用的可执行文件。ThirdParty文件夹包含项目的所有依赖项,包括一些预编译的100+ MB .lib文件和大型库(如boost)。

将所有功能都包含在一个SVN存储库中非常方便,这样(1)开发人员只需执行一次签出操作,(2)我们就无需跟踪每个版本的构建所需的依赖项版本。另一方面,要花些时间检查此仓库。

将这个项目结构转移到git的最佳方法是什么?大概最好是从主存储库中排除ThirdParty以及可能的工具,但是我们希望一步就可以轻松下载ThirdParty,并且我们希望对其进行版本控制(并且主存储库和ThirdParty / Tools之间的版本不匹配会很糟糕)。

在这一点上,我对保存历史不感兴趣,只是对如何组织这样的项目不感兴趣。


这些大小是否超过了回购协议中的大小(包括历史记录),还是本地工作副本的大小?
布朗

1
@DocBrown只是本地工作副本,不包括历史记录。
ikh 2014年

Answers:


10

使用适当的工具进行作业。在Windows中,这意味着

将NuGet用于第三方依赖项

这样,您就可以以版本化的方式保留第三方依赖关系,但是不会用不必要的东西充斥您的存储库。结帐速度更快,并且该项目按原样组织。您可以在Visual Studio中启用一个选项,以便它始终自动下载所有依赖项。

当然,您可以使用仅使用git(另一个回购,子模块等)的解决方案,但这仅仅是黑客。以正确的方式进行操作将很快获得回报,并为您提供面向未来的系统。

注释后编辑:使用NuGet的最佳方法是在共享驱动器或完整nuget服务器上设置本地NuGet源。两种方法的安装时间都不会超过几分钟。这样,您可以确保所需的所有软件包始终可用,无论它们起源于何处。


NuGet是否支持命令行构建?我一直在寻找让Jenkins为我构建和测试的便携式构建。NuGet是否支持Jenkins等CI服务器?
uncletall 2014年

再想一想,您需要多长时间支持您的产品?如果您需要提供很长时间的支持,我不会指望NuGet中提供正确版本的第三方库。依靠NuGet之类的工具来正确地组合第三方工具,即使在现在的2-3年后,您也可能会遇到很大的问题。
uncletall 2014年

3
@uncletall:是的,NuGet具有完整的命令行界面。想法是设置一个本地NuGet存储库,该存储库可能只是网络共享上的文件夹(称为“提要”,docs.nuget.org/docs/creating
Doc Brown

是的,我当然假设您使用本地镜像。我将更新答案。
Wilbert 2014年

2
@ikh为外部依赖关系构建nuget包非常简单直接。我花了大约半天的时间将9个依赖项与50个dll打包在一起,以前从未这样做过。
Wilbert 2014年

5

您可以为工具使用子模块。这样,您可以像现在一样将它们保存在子目录中,并使用单独的存储库对它们进行版本控制。这也意味着您可以克隆(检出)工具并分别进行开发,其他项目也可以依赖这些存储库-以及它们的特定,可审核版本。

您也可以为第三方库使用子模块,但是如果可能的话,我建议为这些库使用依赖项管理器。


4

您变成git存储库的实体必须是您版本和分支的实体;如果SolutionFolder/Tools/Tool1对应于一件事,那就是实体的级别。这是因为git的关于整个国家的目录树是版本化的实体,而使用SVN有可能(即使不是一个好主意)有一个trunkbranchestags在树内的任何地方。

派生的文物不应保存在存储库中,外部库也不应保留。有更好的方法来处理这些问题。(如果您使用的是Java,请考虑使用私有的Maven存储库;它们相对易于使用,并且可以与许多其他东西很好地集成。)

如果您习惯于将所有内容都存储在一个存储库中以便于结帐的工作流程,请考虑使用一个脚本来进行设置。


管理外部库有哪些选择?我们使用C ++和C#在Visual Studio上工作,因此Maven看起来不太合适。这里的主要问题是,该ThirdParty文件夹在存储库中是如此的方便,很难找到一个好的选择。
2014年

2
@ikh:在Visual Studio环境中,通常会为此使用Nuget,即docs.nuget.org,它已包含在VS 2012和更高版本中。
Doc Brown

2

老实说,我不会更改您的设置。这正是我们现在正在做的。我正在设置一个单独的git存储库来处理我们使用的第三方库,但我认为它不会影响可移植性的成本。现在,任何开发人员都可以签出并开始使用,而无需执行任何手动设置步骤。而且我任何构建服务器/从属都可以构建项目。除非您有多个仓库共享第三方工具,否则我将坚持使用当前设置。

我玩的是在单独的仓库中设置第三方工具。然后,我有一个简单的批处理脚本,使用sha1 ref读取文本文件并签出正确的版本。这将允许我为不同的项目使用不同的第三方版本。我是从Facebook Buck构建工具中得到这个想法的。但是最后,许多开发人员不喜欢使用命令行工具(此处为MS VC shop),所以我放弃了这个想法。

为什么在需要时(使用NuGet)不下载第三方库的主要原因之一是,如果您需要长期支持您的产品。在我的行业中,我们有时需要提供依赖于旧的第三方库的旧版本的更新。我们不想花费大量时间来选择可以升级或不能升级的库,而只使用该版本中使用的库。现在,假设您使用NuGet,哎呀...您需要的lib的最新版本是3.98,但您需要的是2.04 .....如何向老板解释,您需要花费两个月的时间来升级旧版本才能在他期望有一个小的改变时使用最新的库!


3
尽管我给了您+1,但由于“按原样保留”是一个务实的解决方案,因此我认为“多个存储库”可能不是唯一的问题。像Git这样的DVCS鼓励拥有多个本地分支,并且在每个分支中都有所有内容的完整本地副本。因此,这可能导致与本地副本多次具有相同的大型第三方库(通常是相同的版本!)。在某些情况下这可能是可行的,在另一些情况下,我可以想象这会对分支和合并的性能产生负面影响。
Doc Brown

据我所知,分支是Git中非常便宜的操作,它将仅创建一个指针并占用几乎零空间。
uncletall 2014年


除非我缺少任何东西,否则分支在Git中是“免费的”。我刚刚检查了.git / refs / heads,所有分支都是1KB文本文件,.git / logs / refs / head包含了日志,其中最大的是master的11KB。我的正常项目结构在代码中约为500MB,第三方库和其他工具。我很高兴采取1KB命中创建一个分支
uncletall

1
@MichaelT:分支本身是免费的,但是我说的是您在本地工作站上并行存在不同分支的多个工作副本的情况。并且,如果您查看原始问题下方的评论,则OP将3GB的第三方工具称为工作副本的大小。
Doc Brown
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.