【问题标题】:git: keep only the latest version of a specific filegit:只保留特定文件的最新版本
【发布时间】:2012-08-30 06:24:57
【问题描述】:
【问题讨论】:
标签:
git
pdf
version-control
github
binaryfiles
【解决方案1】:
如果您已经在 github 上,有一个名为“下载”的面板,您可以在其中添加您拥有的任何文件。如果您想在推送时将其添加到钩子中,则可能有一个 API 调用。您也可能只是构建 + 将 pdf 复制到您的保管箱帐户/rsync 到一个公共文件夹/使用另一个 share-my-files-API/..
您最好生成 pdf 文件并将其通过电子邮件发送给他们,这也是由钩子触发的。
如果您最终构建,将 pdf 添加到 repo,然后大量更新该文件,repo 将变得非常大,因为它必须坚持的差异会占用大量不必要的空间。
【解决方案2】:
没有从存储库中删除旧版本文件的简便方法。每个提交都是安全的,这意味着提交的标识符是使用每个文件的内容构建的。 git 存储库的rewriting the history 有多种方式,但这样做会完全破坏任何协作的机会,因为每次重写历史时基本上都是在创建一个新的存储库。
另一种方法是使用专门为此目标设计的git annex:在小型存储库中管理大型文件。不幸的是,这是一个相当新的功能,而且它不是官方 Git 的一部分,所以对它的支持不是那么好。
【解决方案3】:
我也有同样的问题。几年过去了,我认为现有的答案不再是最佳的。如果我理解正确的话,github 下载不再是免费功能——只有在您为自己的 github 帐户付费时才能获得此功能。
虽然 Sergiu Dumitriu 的回答正确地指出了在 git 中重写历史的缺点,但我和 OP 都在进行单独的项目,对于这样的项目,重写历史实际上并不是什么大不了的事。
截至 2022 年,对我来说似乎效果很好的解决方案如下。我在 docs/ 子目录中为我的项目制作了一个 Github Pages 网页。当我将我的乳胶文件编译为 pdf 时,我的 makefile 会将 pdf 复制到该目录中。 pdf 文件受版本控制。随着时间的推移,这个 pdf 文件的二进制差异会大大增加我的目录树的大小。但是,我可以使用 git filter-repo(第三方工具)从我的项目历史记录中删除该文件。然后我的 makefile 脚本将文件的最新版本复制回 docs/ 子目录。这是我的 makefile 的相关部分的样子:
forget_pdf_history:
test -e $(BOOK).pdf || exit 1
git commit --allow-empty -a -m "updating before erasing history of docs/$(BOOK).pdf"
git filter-repo --path docs/$(BOOK).pdf --invert-paths
make reconfigure_git
cp $(BOOK).pdf docs
git add docs/$(BOOK).pdf
git push --force -u origin master
reconfigure_git:
git remote add origin https://github.com/bcrowell/ransom.git
git config remote.origin.url git@github.com:bcrowell/ransom.git
我不得不重新构建 git 的配置确实很难看,但它确实有效,并且它允许我在不使用 github 以外的任何资源的情况下为这本书提供一个合理的网站。