我正在与一家公司合作建立一个全新的项目,我们正在谈论要使用什么工具。我当时谈论的是Artifactory或Nexus,用于存储内置工件(在这种情况下为APK),他们问为什么他们不能像使用软件那样仅使用Bitbucket来减少安装和维护所需的工具数量。

我最初的回答是“源进入源回购,工件进入工件回购”,但这实际上不是答案,为什么不是。实际上,谷歌搜索也没有提供任何理由。

补充说明:此产品用于受管制的行业。这意味着我们需要构建的工件的完整版本,可审核的记录。这是我们对此进行调查的原因之一。另外,正如我在一些评论中所述,但会在此处添加,我们会将Bitbucket安装在公众无法访问的私有GCP中,因此不必担心其他人会访问它。如果我们将它们存储在Bitbucket中,会在以后对我们产生什么影响?

#1 楼

不将大型二进制文件存储在git存储库中的原因:


每个克隆您的存储库的人都会默认下载所有这些二进制文件。与源代码相比,如果定期生成的二进制文件会占用大量存储空间-git无法压缩它们或计算增量以减小其大小。

git会竭尽全力确保历史记录不会丢失,它将永远不会删除任何ref历史记录中的任何内容(分支或标签)。这也意味着,如果以后由于空间不足而决定删除旧的,长期无用的二进制文件,您会发现确实确实很困难,尽管并非不可能,但确实如此。
正确的工件存储的一点是它们可以帮助您淘汰过时或受损的零件。 git不能真正为您做到这一点-您必须为此编写自己的工具-并且您将永远不会摆脱历史上的旧版本。
“提交”的概念并不真正适用于二进制文件。您需要“上传”和“下载”之类的操作,因为它们经常参与您软件的构建过程(例如,ruby世界中的bundler或Java中的maven)。这些构建者知道如何轻松地从工件存储库中获取其第三方库,以及如何上传新版本。他们可能被说服使用git存储库进行下载,但是由于git没有版本信息,因此您再次需要拥有自己的工具,指定在其中手动查找该二进制文件的提交,或者检出所有正在使用的二进制文件本地。再次上传到git存储库将使用您自己的工具(也创建虚假提交)。

总之,使用git只是错误的工具。如果您的同事害怕添加另一个复杂的工具(例如Nexus),那么至少可以说服他们使用简单的工具而不是git-就像某个虚拟机中某个虚拟机中的任意(s)ftp / scp存储库一样,可以通过简单的Web服务器访问https。 />
如果必须使用git,则至少要确保构建二进制文件不与源代码一起提交,而是在历史记录中提交。请查看这个较早的答案,以了解如何创建孤立分支。至少可以稍后将其删除,并通过垃圾回收将二进制文件本身删除;并非每个客户端都被迫一直下载所有这些客户端。

评论


阅读您的问题后,请参阅我在原始问题中添加的内容。我们需要完整记录所有构建的工件。我对您的陈述“ Git没有版本信息”感到好奇。这就是git所做的,而对构建的工件进行版本控制正是我们所需要的。我们还在构建APK,而不是将库包含在其他版本中。 WRT一起检查源代码和二进制文件,是的,我希望对二进制文件使用不同的仓库。谢谢。

– dj_segfault
18-10-6在6:57



我的意思是语义上的“版本信息”-工件存储库知道单个工件(名称)可以具有多个版本;给您“最新”的,依此类推。根据您的评论,使用不同的存储库这一事实很重要,并且也应该引起疑问。那会改变整个观点。我的回答是假设您的同事希望将构建二进制文件与源代码一起提交。

– AnoE
18-10-6在7:57

#2 楼

您可以使用Git信息库(无论它是否托管在Bitbucket上)作为工件信息库,但您应该注意:


Git最初是作为以下版本的版本控制系统制作的源代码,而不是(大型)二进制数据,这仍然是其主要关注点。有一些扩展名可以有效地在Git中处理大型文件,例如Git LFS,但仍然:它没有内置在Git的核心中。
适当的工件存储库具有无法轻松提供基于Git的服务的功能。例如,您可能想要删除较旧的快照工件,而Git并不是为操作而设计的,而是工件存储库的核心功能是什么。问题“什么是工件存储库?”的答案中描述了更多此类功能。用锤子代替螺丝刀。

#3 楼

如果将apk文件存储在Bitbucket的存储库中,则需要使用git或curl进行克隆。
如果存储库私有,则需要访问它,限制大小等。

软件存储库存储二进制文件更方便。您可以创建自己的Maven镜像Google repos。

评论


有趣的角度。碰巧的是,此应用程序是一个Android应用程序,始终会在侧面加载,而不是从应用程序商店加载。回购协议是私人的,这对我们是有利的。我同意,如果我们正在谈论要包含在其他版本中的库,那么所有这一切将成为一个更大的问题。感谢您的输入。

– dj_segfault
18-10-5在5:22

#4 楼

您可以使用bitbucket管道将其部署到下载部分,并将工件保留在那里。这是他们文档中的一个例子

评论


我发现了这一点,并认为这是个好主意,但是我认为(尚未找到明确说明的文档)下载仅适用于其云版本。我们正在环境中安装Bitbucket。那还行吗?

– dj_segfault
18-10-5在5:10

@ dj_segfault,Bitbucket管道(可能还包括下载部分)(当前?)是“仅云”,请在Atlassians支持论坛和BSERV-9245的错误跟踪器中查看此问题。

– siegi
18-10-5在6:32



#5 楼

正如其他人所说,您不会将二进制文件签入git。但是,Bitbucket每个回购都提供了单独的“下载”区域。这是一个单独的区域,不是git repo的一部分。如果使用Bitbucket Pipelines,甚至适合工作流程,您甚至可以自动将部署部署到下载区域。