如何导入包含大文件的 git 个存储库?

How to import git repositories with large files?

假设 GitHub doesn't allow to push files larger than 100 MB, it is not possible to git clone and push 一个包含大文件的存储库进入 GitHub 企业。推送失败并显示:

remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: File large.zip is 145.00 MB; this exceeds GitHub Enterprise's file size limit of 100.00 MB

(N.B。:有一个 repository importer,但这仅适用于 github.com,并且需要 public 访问您的存储库)

幸运的是,GitHub provides support for storage of files larger than 100MB 自 2015 年 4 月以来。那么如何将具有如此大文件的当前存储库转换为我可以推送到的 GitHub LFS 兼容存储库?

我发现的最简单的方法是利用 git filter-branch and the BFG Repo-Cleaner by rtyley(我使用版本 1.12.12):

  1. 先决条件:您需要安装 git lfs

  2. 在 GitHub Enterprise 上创建一个新的存储库。您会将外部 Git 存储库导入到这个新存储库。

  3. 克隆要迁移到本地文件夹的存储库:

$ git clone --mirror git@oldgithost:repo
$ cd repo.git
# mirror into a local directory
  1. 重写历史以 lfs-track 您的大文件1:
$ git filter-branch --tree-filter 'git lfs track "*.{zip,jar}"' -- --all
# writes the patterns to lsf-track into .gitattributes
  1. 使用BFG将相关文件解压到GitLFS
$ java -jar ~/usr/bfg-repo-cleaner/bfg-1.12.12.jar --convert-to-git-lfs '*.zip'
$ java -jar ~/usr/bfg-repo-cleaner/bfg-1.12.12.jar --convert-to-git-lfs '*.jar'
# Convert large files (I couldn't find a one-liner for multiple patterns)
  1. 推送到您的 GitHub 企业远程:
$ git push --mirror https://hostname/ghuser/repo.git
# Pushes the mirror to the new GitHub Enterprise repository
  1. 删除临时目录:
$ cd ..
$ rm -rf repo.git

备注

1 由于I/O高,所以recommended用-d选项将历史重写到磁盘外的临时目录中,例如在 tmpfs 上。

您现在可以使用 git lfs migrate 内置命令来评估哪些文件最适合迁移并进行实际的历史记录重写。

有关详细信息,请参阅 git-lfs migration tutorial