Git:只存储最新的副本,不存储增量

Git: Only storing the latest copy, not the deltas

我的代码有一个 git 存储库,但也想在子目录中包含一些 Word 文件和 PDF,可能还想添加一些二进制文件。我不想存储增量,只存储这些文件的最新版本。在 git 中有没有办法做到这一点?

有几种方法可以让您随心所欲。在这里,他们从最愉快到最不愉快。

如果它们很小,或者不经常更改,请不要担心。如果你不压缩它们(记住 PDF 通常是压缩的),Git 仍然可以获取二进制文件的增量(我想,你可能不得不欺骗它,让它认为它是一个文本文件)。

Update 如果它们很大,使用 Git Large File Storage (git-lfs) 存储它们历史,但将庞大的历史内容保存在云端。您只需要下载您签出的版本。这使您可以在保持存储库精简的同时存储大文件。

如果他们从小开始变大,请使用 BFG Repo Cleaner to retroactively store their history in git-lfs

如果它们很大或经常更改,最好的选择可能是不将文件存储在 Git 中。相反,下载它们作为构建过程的一部分。你不需要他们的历史,你只想要他们的最新版本。

另一种是使用像git-annex, as recommended in this answer这样的工具。

git-annex allows managing files with git, without checking the file contents into git. While that may seem paradoxical, it is useful when dealing with files larger than git can currently easily handle, whether due to limitations in memory, time, or disk space.

另一种方法是将它们存储在 另一个 Git 存储库中,然后 link 使用 submodules or subtrees 将其存储到您的存储库中。可以使用 --depth 标志告诉子模块制作子存储库的浅表副本。这使您可以保留那些大文件的历史记录 并且 可以使您的开发存储库的历史记录很小。不幸的是,这两种技术都有其注意事项。

最后,您可以使用 git-filter-branch 或 BFG 定期从历史记录中剔除文件。这不仅是一个手动过程,而且因为 Git 无法更改历史,所以它 创建新的历史 ,它将重写以下所有提交并在推拉时造成普遍混乱。

Much of this is covered in this question.