因此,在尝试将我们的公司回购从SVN迁移到Git的过程中,我遇到了以下问题 -
目前,我们有一个" lib"我们的存储库中的文件夹包含来自各种内部项目的各种DLL(以及第三方DLL,但这是一个更容易的问题)。目前可以简单地构建一个内部项目,提交相关的构建输出,然后更新" lib"获取新版DLL的文件夹。这是通过" svn:externals" " lib"文件夹,它有指向各种项目的构建输出目录的指针。
因此,如果我们希望lib在名为FooLib的情况下拥有项目Foo,我们就会有一行
^/path/to/foo/in/svn/build/Release FooLib
在lib的svn:externals属性中。
我知道这不是做事的最佳方式,但目前不建议更改它。我试图在Git中复制这个工作流程,而且我并不完全确定我这样做的想法是对的,所以我想知道它是否是一个更好的方式。为了记录,我们的开发人员(很明显,来自我对DLL的讨论)运行Windows,而git服务器是Linux。
理想情况下,我也喜欢" lib"子模块保持服务器端而不被克隆请求拉下来,因为它实际上是用户的实现细节(目前我们只是检查" lib"到我们硬盘上的固定目录并不断更新它,与Git同样简单)。
这个想法是否正确?无望复杂?我错过了什么吗?有没有更好的方法来解决这个问题?
答案 0 :(得分:2)
通常,应该避免将dll和二进制文件(特别是如果它们经常更新)添加到git存储库。这样做会炸毁存储库的大小,并且由于整个存储库的历史记录也存储在开发人员的PC本地,因此它可以使回购的初始克隆变得痛苦和耗时。
也许这不是你想听到的,也许你不能(因为你无法控制的原因这样做),但这是我的建议:
第三方dll应该通过NuGet包引用。如果你看它Nuo,它会允许 您可以在干净的结账时恢复项目的引用,因此无需将二进制文件提交到您的仓库。有关详细信息,请查看nuget.org中的文档
对于内部项目,您应该检查为什么将它们作为dll而不是项目引用它们。如果项目仅由一个应用程序使用,则应将其作为项目(Visual Studio中的项目引用)引用,而不是作为程序集引用。如果此项目由多个应用程序引用,则应考虑将这些解决方案合并到一个Visual Studio解决方案中,尤其是当这些应用程序共享多个项目时。如果这不合适,那么您应该将此项目作为自己的解决方案(或者将更多项目组合成一个解决方案)并让您的CI服务器构建它并生成NuGets供您通过本地在主应用程序项目/解决方案中引用Nuget服务器或文件系统共享。我们的想法是,在引用它们时,应该像对待外部(如log4net)一样处理内部可重用项目。
这需要更多的工作,但这是正确的方法,你有一个很好的解耦系统,不会将一个二进制文件提交到存储库。
显然上面只是整体思想的概述,而魔鬼在细节上,但我希望如果你有兴趣并且你认为这是一个好主意,我会给你足够的信息来进一步了解。
答案 1 :(得分:1)
对于那些无法实施tolism7的建议(这确实是最佳做法)的其他人,我最终选择了我在问题中提到的内容 - 我为后期写了git hook收到事件(以免干扰推送到repo),检查repo中的指定DLL是否包含在提交中。如果是这样,新的DLL被推送到我们特殊的"系统"回购。如果有必要的话,我想你也可以把这个回购作为一个子模块包含在内,但是我们已经习惯了有一个"魔术目录"将所有dll放在系统上的固定位置,这样我们就可以复制它了。