我们有一个包含几个大型 SQL 文件的存储库,大小从 100MB 到 10GB 不等。
一直尝试设置本地克隆,这样我们只下载在任何给定时间需要更改和提交的 sql 文件,而不是下载所有 sql 文件,即使我们只需要一个。
我已经能够使用以下命令接近目标。它一直工作到我提交更改为止,此时它会下载当前分支中的所有文件。
git clone --filter=blob:none --depth 1 -n --sparse <url>
cd <repoDir>
git sparse-checkout set <fileNeedingChangedAndCommitted>
git restore --staged .
git restore <fileNeedingChangedAndCommitted>
# At this point, the file I need to change is downloaded locally, ready for changes.
# Make changes to file.
git add <fileNeedingChangedAndCommitted>
git commit -m "test"
# At this point, all other files in current branch are downloaded, even if not changed.
我觉得这应该是可能的,但也许我误解了稀疏结帐的概念或遗漏了步骤/细节。
有没有什么方法可以只下载您想要更改的文件,然后提交这些更改,而无需下载当前分支中的每个文件?
编辑:根据我的测试和对这个问题的讨论,我得出结论,使用 Git 无法做到这一点。但是,我们决定将 SQL 文件保留在同一个存储库中的各自孤立的分支中,因此它们各自都有自己的提交历史记录/链,但位于同一个存储库中以便组织。这使我们能够在任何给定时间仅签出我们需要的分支/文件,并进行更改/提交,而无需下载其他 sql 文件的所有 blob/哈希。这不适用于每种情况,但暂时解决了我们的要求 :)
问题不在于稀疏检出,而在于
--filter=blob:none
。此过滤器可防止在克隆时下载所有对象,但 Git 稍后会在访问时下载必要的对象。很可能不会。实际上,Git 在每次提交中都会存储整个工作树的副本。我说“实际上”是因为从技术上讲,Git 会尽最大努力从不存储副本,而是保存指向现有对象的指针。要构造提交,Git 需要上一次提交的所有树和 blob,因此它会下载这些。使用稀疏签出但没有过滤器,Git 将拥有所有必要的对象,并且不会下载任何东西;但一切都必须预先下载。
底线是:您可以尽可能少地下载和使用本地对象。但是一旦您要提交,Git 将需要所有对象。因此,您要么容忍 Git 下载所需的对象,要么允许 Git 通过删除过滤器预先下载所有内容:
git clone --depth 1 -n --sparse <url>