我们有一个包含多个大型 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.
我觉得这应该是可能的,但也许我误解了稀疏结帐的概念或遗漏了步骤/细节。
有没有办法只下载要更改的文件,然后提交这些更改,而不下载当前分支中的每个文件?
我觉得这应该是可能的,但也许我误解了稀疏结帐的概念
问题不在于稀疏结帐,问题在于
--filter=blob:none
。此过滤器可防止在克隆时下载所有对象,但 Git 会在稍后访问所需的对象时下载这些对象。
有什么方法可以只下载要更改的文件,然后提交这些更改而不下载每个文件
很可能不会。实际上,Git 在每次提交时都会存储整个工作树的副本。我说“虚拟”是因为从技术上讲,Git 尽最大努力从不存储副本,而是保存指向现有对象的指针。要构建提交,Git 需要先前提交中的所有树和 blob,因此这就是它下载的内容。使用稀疏结帐但没有过滤器,Git 将拥有所有必需的对象,并且不会下载任何内容;但所有内容都必须预先下载。
底线:您可以尽可能少地在本地下载和使用。但是一旦你要提交,Git 将需要所有对象。因此,要么容忍 Git 下载所需的对象,要么允许 Git 通过删除过滤器来预下载所有内容:
git clone --depth 1 -n --sparse <url>