我正在寻找如何处理我的源代码(Web应用程序)所依赖的大型二进制文件的意见。我们目前正在讨论几种选择:
手动复制二进制文件。
-
亲:不
-
Contra:我强烈反对这一点,因为它增加了在设置新站点/迁移旧站点时出错的可能性。建立另一个障碍。
用Git管理所有这些。
-
专业:删除'忘记'复制重要文件的可能性
-
反对:膨胀存储库并降低管理代码库和检出,克隆等的灵活性将需要相当长的时间。
单独的存储库。
-
Pro:检查/克隆源代码的速度很快,图像可以在自己的存储库中正确存档。
-
Contra:删除了在项目中拥有唯一的Git存储库的简单性。它肯定会介绍一些我没有想过的其他事情。
您对此有何体验/想法?
另外:有没有人有多个Git存储库的经验并在一个项目中管理它们?
这些文件是程序的图像,该程序生成包含这些文件的PDF。文件不会经常更改(如年份),但它们与程序非常相关。没有文件,程序将无法运行。
-
什么时候需要控制二进制文件的版本? 我正在考虑从事资产工作的艺术团队。
-
如果有必要,则必须平衡可用资源(磁盘,带宽,CPU时间)与获得的好处。
-
请注意,如果没有文件锁定,当多个人需要处理同一个二进制文件时,git并不是很好。
-
另请参阅基于git的备份文件bup。
-
屏幕录像的链接已被破坏。 似乎gitcasts.com失败了。
-
他们在这里是bestechvideos.com/tag/gitcasts
-
@doughgle您发布的网站仅包含指向不再存在的gitcasts.com子域的链接。
-
自Aril 2015以来,您现在拥有GitHub LTS解决方案:请参阅下面的答案
-
可以将大型二进制文件存储在单个git存储库中,而不会使存储库膨胀,有效的检出和低效克隆的解决方法只需查看我的答案即可。
我最近发现了git-annex,我觉得很棒。它旨在有效地管理大型文件。我将它用于我的照片/音乐(等)收藏品。 git-annex的开发非常活跃。可以从Git存储库中删除文件的内容,只有Git(通过符号链接)跟踪树层次结构。但是,要获取文件的内容,在拉/推之后需要第二步,例如:
1 2 3 4 5 6 7 8 9
| $ git annex add mybigfile
$ git commit -m'add mybigfile'
$ git push myremote
$ git annex copy --to myremote mybigfile ## This command copies the actual content to myremote
$ git annex drop mybigfile ## Remove content from local repo
...
$ git annex get mybigfile ## Retrieve the content
## or to specify the remote from which to get:
$ git annex copy --from myremote mybigfile |
有许多命令可用,网站上有很好的文档。 Debian上提供了一个软件包。
-
哇!赞成真棒!这实现了我最近的想法,以及更多。它是用Haskell编写的。顺便说一句,git-media是一个不错的选择。
-
子模块令人困惑,使用它们很容易"迷路"。附件似乎是解决这个问题的更好方法。
-
但是,Annex不支持Windows。这对游戏开发者来说是个问题。
-
我听说Steam正在放弃对windows的支持,并添加对Linux的支持...;)但是,认真地说,移植它有多难?我想你的普通游戏开发者可以做到这一点。
-
@SamWatkins它使用simlinks所以它不是那么容易移植。
-
@ e-satisf Windows有符号链接。但仔细观察后,似乎每个路径可以拥有多少个符号链接。但是Windows中有符号链接:msdn.microsoft.com/en-us/library/windows/desktop/
-
@EstebanBrenes真正的交易破坏者是在正常配置中,Windows符号链接需要提升权限才能创建。
-
Git-annex本身有一些关于移植到Windows的障碍的文档:git-annex.branchable.com/todo/windows_support
-
不使用附件的其他一些原因:不支持多个用户同步二进制文件更改。不是为了保存文件的长期版本历史[历史存在,恢复的能力不是真的]
-
@iheanyi:恢复的能力完全在这里,它只需要用户决定如何处理(比常规git内容更不自动)。如果你想要删除同步(即二进制文件的旧版本),你可以在项目中有一个特殊的"已删除"目录,其中包含所有附件文件的"副本"(即符号链接),这样它们就不会显示为未使用git-annex,虽然正确同步。另一种解决方案是将旧版本重命名为:emac:。file~1,.file~2,...或任何其他方案。通过git annex unlock复制内容可以轻松实现这一点。
-
我刚刚找到这个页面。它读到现在git annex在Windows上也可用。如果有人曾在Windows中测试过,我想听听他或她的经历!
-
如果必须在工作树中更新文件,它将如何工作?例如,我有一个由latex生成的pdf文件,由于git-annex实际上与符号链接有效,它将如何工作?
如果程序在没有文件的情况下无法工作,似乎将它们分成单独的仓库是一个坏主意。我们有大型测试套件,我们分成一个单独的回购,但那些是真正的"辅助"文件。
但是,您可以在单独的仓库中管理文件,然后使用git-submodule以理智的方式将它们拉入项目中。所以,你仍然拥有所有来源的完整历史记录,但据我所知,你只有你的图像子模块的一个相关版本。 git-submodule工具应该可以帮助您保持正确版本的代码符合正确的图像版本。
这是对Git Book子模块的一个很好的介绍。
-
"据我所知,你只有你的图像子模块的一个相关版本。"我不认为这是正确的。
-
确实。子模块是一个完整的Git存储库,它恰好嵌套在父存储库中。它知道它的整个历史。你可以不那么频繁地提交它,但是如果你在父母中存储相同的东西,那么父母会有同样的问题。
-
如果您有大量的二进制文件以一定的间隔更改,这是一个非常糟糕的解决方案。我们有一个非常臃肿的存储库,因为每个构建都会存储一个新的二进制文件。如果您不在Windows上,如下所述,附件是一个很好的解决方案。如果你在Windows上......只需继续寻找。
-
在repo中拥有大型二进制文件的另一个问题是性能。 Git不是为了应对大型二进制文件而设计的,一旦回购大小上升到3G +,性能就会迅速下降。这意味着在repo中拥有大型二进制文件会限制您的托管选项。
-
如果您创造性地滥用子模块,子模块可以减少检出数据传输要求:当您想要更新子模块内容时,创建一个没有父项的新提交,然后将超级项目(主git repo)指向新创建的提交而没有父项。从逻辑上讲,这会为子模块创建一个断开连接的历史记录,但作为回报,任何版本的子模块都更容易传输,因为该版本没有历史记录。
-
如果您需要具有二进制文件的持久版本历史记录,则附件并不好。如果您只能使用最新版本。 。 。只要你为它添加了一个钩子,那么你可以使用别的东西。此外,二进制文件无法合并,因此如果您需要由多个用户同步更改,则附件将无用。
-
正如@ A.A.Grapsas所说,除了一个糟糕的解决方案之外,值得补充的是,git子模块非常不直观,而且非常可怕。如果你真的想要一个纯粹的git解决方案,请看看我的答案
-
你总是可以浅浅地克隆子模块,忽略它的所有历史(q.v.,--depth)
自2015年4月以来的另一个解决方案是Git大文件存储(LFS)(由GitHub提供)。
它使用git-lfs(请参阅git-lfs.github.com)并使用支持它的服务器进行测试:lfs-test-server:
您只能在git仓库中存储元数据,在其他地方存储大型文件。
-
宣布lfs-test-server不用于生产用途。实际上,我正在制作生产LFS服务器(github.com/artemkin/git-lfs-server)。它正在进行中,但已经可以使用,我们正在内部进行测试。
-
你能用git lfs检查这个二进制文件的早期版本吗?
-
@mucaho你应该:git checkout的语法没有改变,仍然应该调用lfs smudge脚本。
看看git bup,这是一个Git扩展,可以在Git存储库中智能地存储大型二进制文件。
您希望将其作为子模块,但您不必担心存储库难以处理。他们的一个示例用例是在Git中存储VM映像。
我实际上没有看到更好的压缩率,但我的存储库中没有非常大的二进制文件。
你的旅费可能会改变。
-
bup提供存储(内部使用奇偶校验存档进行冗余,git用于压缩,重复数据删除和历史记录),但它不会扩展git。 git-annex是一个git扩展,提供了一个bup存储后端。
-
@Tobu当我发布这个时,git附件还不存在(在主流版本中)
-
bup对于管理大文件肯定很有意思。我想指出UI的不同之处:你在任何存储库上下文之外使用bup命令,而git是一个实现细节。
你也可以使用git-fat。我喜欢它只依赖于库存Python和rsync。它还支持通常的Git工作流,具有以下自解释命令:
1 2 3
| git fat init
git fat push
git fat pull |
此外,您需要将.gitfat文件签入存储库并修改.gitattributes以指定希望git fat管理的文件扩展名。
您可以使用普通的git add添加二进制文件,然后根据您的gitattributes规则调用git fat。
最后,它的优点是实际存储二进制文件的位置可以在存储库和用户之间共享,并支持rsync所做的任何事情。
更新:如果您使用的是Git-SVN网桥,请不要使用git-fat。它最终会从Subversion存储库中删除二进制文件。但是,如果您使用纯Git存储库,它可以很好地工作。
我会使用子模块(如Pat Notz)或两个不同的存储库。如果您经常修改二进制文件,那么我会尽量减少清理历史记录的巨大存储库的影响:
几个月前我遇到了一个非常类似的问题:~21GB的MP3文件,未分类(坏名字,坏id3,不知道我是否喜欢那个MP3文件......),并在三台计算机上复制。
我使用带有主Git存储库的外部硬盘驱动器,然后将其克隆到每台计算机中。然后,我开始以习惯的方式对它们进行分类(推,拉,合并......多次删除和重命名)。
最后,我在.git目录中只有~6GB的MP3文件和~83GB。我使用git-write-tree和git-commit-tree创建了一个新的提交,没有提交祖先,并启动了一个指向该提交的新分支。该分支的"git log"仅显示一次提交。
然后,我删除旧分支,只保留新分支,删除引用日志,并运行"git prune":之后,我的.git文件夹仅加权~6GB ...
你可以用同样的方式"清除"巨大的存储库:你的"git clone"会更快。
-
我做了类似的事情,我不得不拆分一个存储库,我偶然合并为两个不同的存储库。虽然有趣的使用模式。 :)
-
这是否与以下相同:rm -f .git; git init; git add。 ; git commit -m"垃圾历史。"
-
是的,它只在我的mp3情况下是一样的。但有时你不想触摸你的分支和标签(公共存储库中没有空间减少),但是你想要加速只有一个分支的"git clone / fetch / pull"(专用于那个 - 的空间更少)分支机构库)。
在我看来,如果你经常修改那些大文件,或者你打算制作大量的git clone或git checkout,那么你应该认真考虑使用另一个Git存储库(或者可能是另一种方式来访问那些文件)。
但是如果你像我们一样工作,并且你的二进制文件经常不被修改,那么第一次克隆/结账将会很长,但之后它应该尽可能快(考虑到你的用户继续使用第一个克隆的存储库他们有)。
-
并且,单独的回购不会缩短结账时间,因为您仍然需要检查两个回购!
-
如果你稳定地清理"二元回购"的历史,@ EmilSit单独的回购可以使结账更短。此外,开发者不会被迫每次都检查两个回购。
-
为什么不让主模块的构建脚本从第二个repo中获取二进制文件,逐个提取它们(如下所示:stackoverflow.com/questions/1125476/)。
-
即使您的二进制文件没有经常更改,如果您经常将分支推送到存储库以进行协作,那么大文件仍然可能会导致您的工作流停顿。
我想提出的解决方案是基于孤立分支和略微滥用标记机制,以下称为* Orphan标记二进制存储(OTABS)
TL; DR 12-01-2017如果你可以使用github的LFS或其他第三方,你应该这样做。如果你不能,请继续阅读。请注意,这个解决方案是一个黑客,应该这样对待。
OTABS的理想特性
它是纯粹的git和git解决方案 - 它可以在没有任何第三方软件(如git-annex)或第三方基础设施(如github的LFS)的情况下完成工作。
它有效地存储二进制文件,即它不会破坏存储库的历史记录。
git pull和git fetch(包括git fetch --all)仍具有带宽效率,即默认情况下不会从远程提取所有大二进制文件。
它适用于Windows。
它将所有内容存储在一个git存储库中。
它允许删除过时的二进制文件(与bup不同)。
OTABS的不良特性
它使git clone可能效率低下(但不一定,取决于您的使用情况)。如果部署此解决方案,则可能需要建议您的同事使用git clone -b master --single-branch 而不是git clone。这是因为默认情况下git clone会克隆整个存储库,包括通常不想浪费带宽的事情,比如未引用的提交。取自SO 4811434。
它使git fetch --tags带宽效率低下,但不一定是存储效率低下。您可以随时建议您的同事不要使用它。
你必须定期使用git gc技巧从任何你不想要的文件清理你的存储库。
它不如bup或git-bigfiles有效。但它分别更适合您尝试做的事情和更多现成的产品。您可能会遇到成千上万个小文件或数千字节文件的问题,但请继续阅读以获取解决方法。
添加二进制文件
在开始之前确保您已提交所有更改,您的工作树是最新的,并且您的索引不包含任何未提交的更改。如果发生任何灾难,将所有本地分支机构推送到远程(github等)可能是个好主意。
创建一个新的孤儿分支。 git checkout --orphan binaryStuff会做到这一点。这会生成一个完全与任何其他分支断开的分支,并且您将在此分支中进行的第一个提交将没有父级,这将使其成为根提交。
使用git rm --cached * .gitignore清理索引。
深呼吸并使用rm -fr * .gitignore删除整个工作树。内部.git目录将保持不变,因为*通配符与它不匹配。
复制到您的VeryBigBinary.exe或您的VeryHeavyDirectory /。
添加它&&提交它。
现在它变得棘手 - 如果你将它作为分支推送到远程控制器,所有开发人员将在下次调用git fetch阻塞其连接时下载它。您可以通过推送标签而不是分支来避免这种情况。如果他们习惯输入git fetch --tags,这仍然会影响您的同事的带宽和文件系统存储,但请继续阅读以解决此问题。继续git tag 1.0.0bin
推送您的孤儿标签git push 1.0.0bin。
因此,您永远不会意外推送二进制分支,您可以将其删除git branch -D binaryStuff。您的提交将不会被标记为垃圾收集,因为指向它的1.0.0bin上的孤立标记足以使其保持活动状态。
签出二进制文件
我如何(或我的同事)将VeryBigBinary.exe签出到当前工作树中?如果您当前的工作分支是例如master,则可以简单地git checkout 1.0.0bin -- VeryBigBinary.exe。
如果您没有下载孤儿标记1.0.0bin,则会失败,在这种情况下,您必须事先获得git fetch 1.0.0bin。
您可以将VeryBigBinary.exe添加到主人的.gitignore中,这样团队中的任何人都不会意外地使用二进制文件污染项目的主历史记录。
完全删除二进制文件
如果您决定从本地存储库,远程存储库和同事的存储库中完全清除VeryBigBinary.exe,您可以:
删除远程git push :refs/tags/1.0.0bin上的孤立标记
在本地删除孤立标记(删除所有其他未引用的标记)git tag -l | xargs git tag -d && git fetch --tags。取自SO 1841341稍作修改。
使用git gc技巧在本地删除您现在未引用的提交。 git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc"$@"。它还将删除所有其他未引用的提交。取自SO 1904860
如果可能,重复遥控器上的git gc技巧。如果您是自托管您的存储库,并且可能无法使用某些git提供程序(例如github或某些公司环境),则可能。如果你正在托管一个不提供ssh访问遥控器的提供商,那就让它吧。您的提供商的基础架构可能会在自己的甜蜜时间内清理您的未引用提交。如果您在公司环境中,您可以建议您的IT运行cron job垃圾,每周一次收集您的遥控器。只要您建议同事始终git clone -b master --single-branch 而不是git clone,他们是否会对您的团队带宽和存储产生任何影响。
想要摆脱过时的孤儿标签的所有同事只需要应用步骤2-3。
然后,您可以重复添加二进制文件的步骤1-8以创建新的孤立标记2.0.0bin。如果您担心同事输入git fetch --tags,您实际上可以再次命名1.0.0bin。这将确保下次他们获取所有标记时旧的1.0.0bin将被取消引用并标记为后续垃圾收集(使用步骤3)。当您尝试覆盖遥控器上的标签时,您必须使用-f,如下所示:git push -f
后记
OTABS不会触及您的主人或任何其他源代码/开发分支。提交哈希值,所有历史记录以及这些分支的小尺寸不受影响。如果您已经使用二进制文件膨胀了源代码历史记录,则必须将其作为单独的工作进行清理。这个脚本可能很有用。
确认使用git-bash在Windows上工作。
最好应用一组标准trics来提高二进制文件的存储效率。经常运行git gc(没有任何其他参数)使得git通过使用二进制增量来优化文件的底层存储。但是,如果您的文件在提交提交时不太可能保持相似,则可以完全关闭二进制增量。此外,因为压缩已压缩或加密的文件(如.zip,.jpg或.crypt)没有意义,git允许您关闭底层存储的压缩。不幸的是,这也是影响源代码的全有或全无设置。
您可能希望编写OTABS的部分脚本以便更快地使用。特别是,从完全删除二进制文件到update git钩子的脚本步骤2-3可以给git fetch("获取并删除过时的所有内容")提供引人注目但可能是危险的语义。
您可能希望跳过完全删除二进制文件的步骤4,以中央存储库膨胀为代价保留远程上所有二进制更改的完整历史记录。随着时间的推移,本地存储库将保持精益。
在Java世界中,可以将此解决方案与maven --offline组合以创建完全存储在您的版本控制中的可重现的离线构建(使用maven比使用gradle更容易)。在Golang世界中,建立这个解决方案来管理你的GOPATH而不是go get是可行的。在python世界中,可以将它与virtualenv结合起来,以生成一个独立的开发环境,而无需从头开始依赖PyPi服务器进行每个构建。
如果您的二进制文件经常更改,例如构建工件,那么编写一个解决方案可能是一个好主意,该解决方案在孤立标记monday_bin,tuesday_bin,...,friday_bin中存储5个最新版本的工件,以及每个版本1.7.8bin 2.0.0bin等的孤立标签。您可以每天旋转weekday_bin并删除旧的二进制文件。通过这种方式,您可以获得两个世界中最好的:保留源代码的整个历史记录,但只保留二进制依赖项的相关历史记录。获取给定标记的二进制文件也很容易,而不会获得包含其所有历史记录的完整源代码:git init && git remote add && git fetch 应该为您完成。
好。
-
"你必须定期使用git gc" - 在那里停止阅读。为什么有人会放弃他们最后的安全带来支持某些黑客攻击?
-
@ user1643723 git gc运行不安全。默认情况下,您所有悬挂的提交将安全地保存在硬盘驱动器上至少30天:git-scm.com/docs/git-gc
-
感谢您的详细说明。我想尝试将此作为一种方式在我的GitHub仓库中存储一些二进制依赖项,以便在有人克隆仓库时默认不下载它们,但可以手动下载并更新本地仓库。但是,我在这一步得到了一个错误:git push 1.0.0bin - remote: error: GH001: Large files detected. You may want to try Git Large File Storage。看起来GitHub可能不再支持这个了吗?有问题的二进制文件大小为100MB。
-
说实话,如果你被允许使用github进行工作,是什么阻止你使用LFS? github的工作人员一直在努力创建这个产品,他们甚至为您托管它,并且他们的基础设施在使用它时进行了优化。这个hack适用于你真的不能使用LFS或其他第三方并且你正在使用纯git解决方案的情况。
-
我还更新了答案,以更清楚地了解这个解决方案实际上是多么糟糕。
SVN似乎比Git更有效地处理二进制增量。
我不得不决定文档的版本控制系统(JPEG文件,PDF文件和.odt文件)。我刚测试添加一个JPEG文件并将其旋转90度四次(以检查二进制增量的有效性)。 Git的存储库增长了400%。 SVN的存储库仅增长了11%。
所以看起来SVN对二进制文件的效率要高得多。
所以我的选择是Git的源代码和SVN的二进制文件,如文档。
-
添加这4个文件后,您只需要运行"git gc"(重新打包和垃圾收集)。 Git不会立即压缩所有添加的内容,因此您将拥有一组文件压缩(在大小方面更有效),并且不会减慢单独压缩每个添加的对象。但即使没有"git gc",git也会最终为你完成压缩,无论如何(在注意到之后,已经积累了足够的解压缩对象)。
-
这听起来像git必须总是推送整个文件,而不是deltas?如果是这样,当SVN处理大型文件时,这将是SVN的另一个优势,据说只在提交中传输二进制增量。
-
@jpierson你在混淆"推"和"提交"吗?在SVN中,没有区别,但是git"commit"是本地操作。立即计算增量只会增加开销。
-
@Aaron - 我对git的经验很少,但我的理解是,在更传统的集中式设置中,推入git最好等同于SVN中的提交。在这种情况下,我原来的评论是,我理解它推送git将每次推送发送整个文件。这意味着如果我只改变100MB图像上的一个像素,我将需要将100MB文件中的每个字节发送到git push中的源存储库。我的理解是SVN在这种情况下效率更高。
-
@jpierson我创建了一个空的git存储库并添加(并提交了)一个大小为41MB的完全白色的bmp映像,这导致了一个总大小为328KB的git存储库。在git gc之后,总git存储库大小减少到184KB。然后我将单个像素从白色更改为黑色并提交此更改,总git存储库大小增加到388KB,并且在git gc之后,总git存储库的大小减少到184KB。这表明git非常适合压缩和查找二进制文件的增量。
-
@Tader - 但是当进行推送时,整个内容是否会通过网络传输?
-
@jpierson推送仅传输差异。因此,第一次推送将传输所有数据(压缩)。后续推送仅传输更改。
-
@Tader - 很酷,感谢您对Tader的评论。如果这些事实成立,那么Git在如何有效地处理二进制文件或内容方面确实令人印象深刻。
-
@jpierson旁注:我刚评论了二进制增量。如果它管理具有大(GB大小)文件的存储库,Git将占用您的所有内存和交换。为此,请使用git-annex(已在其他答案中提及)......
-
SVN无法处理,它只能进行基于dir的检查。让程序员获取纹理构建器的技嘉数据是愚蠢的......
-
@Tader这个内存使用在1.7.9中有所改善。从发行说明:作为更好地支持大文件的另一个步骤,"git add"将大文件直接存储到新的packfile中,而不必立即将所有内容保存在内核中。我认为有计划进一步改善这一点,但我不确定会有什么目标:重新包装性能?
-
我无法相信没有人提到SVN对banches和标签的处理。在Git或CVS中,标签几乎不需要存储。在subversion中,标签或分支是副本,因此添加第一个标签会使repo大小加倍。因此,SVN对于二进制文件来说是一个非常糟糕的选择。 - Robert Boehne的评论
-
@JanDvorak - 没有人提到它,因为它完全是不真实的。 Subversion副本很便宜 - svnbook.red-bean.com/en/1.7/svn.branchmerge.using.html - 关于页面的中间部分。
-
@Tader:你的考试不好。你所谓的二进制文件实际上(从git的角度来看)更像是一个文本文件 - 比特流是字节对齐的,并且有一些有意义的本地化差异;毕竟,更改一个像素基本上相当于更改文本文件中的一个字符(现在谁使用未压缩的位图?)尝试使用小视频,压缩图像,虚拟机,zipfile或其他任何相同的实验 - 你会发现那个git没有有效地处理delta;事实上,不可压缩的数据根本不可能。
-
@EamonNerbonne:大概是对的,但是如果视频或压缩图像的变化在某种意义上很小,那么就存在一个小的表示(压缩) - 问题是自动发现这些表示是非常困难的。如果git为最终用户修改暴露压缩机制,这可以减轻......你知道它是否存在?
来自Git 2.19 +浅克隆的git clone --filter
这个新选项可能最终成为二进制文件问题的最终解决方案,如果Git和GitHub开发并使其足够用户友好(例如,他们可能仍未实现子模块)。
它实际上只允许获取服务器所需的文件和目录,并与远程协议扩展一起引入。
有了这个,我们可以先做一个浅层克隆,然后自动化使用构建系统为每种类型的构建获取哪些blob。
甚至已经有--filter=blob:limit允许限制最大blob大小来获取。
我提供了一个最简单的详细示例,说明了该功能的外观:如何克隆仅Git存储库的子目录?
I am looking for opinions of how to handle large binary files on which my source code (web application) is dependent. What are your experiences/thoughts regarding this?
一旦我的Web应用程序二进制数据超过3GB标记,我个人就会遇到Git与我的一些云主机同步故障。我当时考虑过BFT Repo Cleaner,但感觉就像是黑客。从那时起,我开始将文件保留在Git范围之外,而是利用专用的工具(如Amazon S3)来管理文件,版本控制和备份。
Does anybody have experience with multiple Git repositories and managing them in one project?
是。 Hugo主题主要通过这种方式进行管理。它有点kudgy,但它完成了工作。
我的建议是为工作选择合适的工具。如果是公司,你在GitHub上管理你的代码行,就要付钱并使用Gi??t-LFS。否则,您可以探索更多创意选项,例如使用区块链的分散式加密文件存储。
要考虑的其他选项包括Minio和s3cmd。
看看camlistore。它不是基于Git的,但我发现它更适合你必须做的事情。