如何禁用 git-lfs?

How to I disable git-lfs?

我在 bitbucket 上有一个使用 LFS 的存储库。由于使用了一段时间,我决定将存储库移回我控制的 space。我最初使用 LFS 的唯一原因是有效地加倍了我的存储库大小限制(因为 LFS 中的文件放在一个单独的存储桶中)但现在我要移动它,我不再需要这样做了。

我需要一种方法来遍历整个 git 历史,删除所有 git LFS 所做工作的痕迹(因此所有文件都已提交 'normally')。完成后,我打算强制推送到新存储库。

我搜索了很多,找到了 suggested solutions 但我不明白如何 implement/run 因为它们是高级的。

如何告别 git LFS?

仅更新​​当前提交

如果您想离开 LFS,但又不太担心修复整个 git 历史记录,您可以执行以下操作;

git lfs uninstall
touch **/*
git commit -a

这将卸载 LFS 支持,触摸每个文件(以便 git 识别已更改)然后全部提交。如果您愿意,可以更具体(例如,**/*.png)。请注意,使用 ** 需要启用扩展的 glob 支持(bash 上的 shopt -s globstar

更新整个历史记录

这对我有用 - 但它会抛出很多错误(我 认为 我在每次提交时都收到一个错误,文件没有被添加到 LFS 中)并且需要很长时间(每次提交大约 2-3 秒)。

git lfs uninstall
git filter-branch -f --prune-empty --tree-filter '
  git lfs checkout
  git lfs ls-files | cut -d " " -f 3 | xargs touch
  git rm -f .gitattributes
  git lfs ls-files | cut -d " " -f 3 | git add
' --tag-name-filter cat -- --all

它卸载 git LFS 支持(理论上防止 LFS 弄乱索引)然后对于每次提交它确保 LFS 文件被正确检出,然后接触它们(所以 git意识到它们已经改变了),删除了在 .gitattributes 中找到的 LFS 设置,这样在克隆时它就不会一直尝试使用 LFS,然后将真实文件添加到索引中。

完成上述操作后,您将需要用力推动。自然地,这会让处理你的 repo 的任何其他人陷入一种超然的头脑状态——所以在代码冻结期间这样做是明智的。之后,让每个人都做一个新的克隆可能是最容易的。

对于特定文件

  1. .gitattributes
  2. 中删除 file/pattern
  3. 转到文件目录 运行 touch myfile.bin
  4. 提交并推送更改

git lfs migrate export

来自 git lfs migrate help:

Export

The export mode migrates Git LFS pointer files present in the Git history out of Git LFS, converting them into their corresponding object files.

示例工作流程

  1. 确认您确实拥有 git lfs ls-files.
  2. 的 LFS 文件
  3. 从您的存储库中的所有 .gitattributes 文件中删除所有 filter=lfs 行。 .gitattributes 可以在任何地方生活,因此请确保找到所有的人,否则这可能会在以后导致迁移问题。
  4. 提交您对 .gitattributes 所做的任何更改。
  5. 确保 git status 没有变化。
  6. 运行 迁移:git lfs migrate export --everything --include .
  7. 运行 git status 以确保您没有任何更改。如果您将 .gitattributes 保留为 filter=lfs,您现在可能有错误的更改。
  8. 验证之前列出的所有 LFS 文件不再与 git lfs ls-files 一起出现。
  9. 检查文件(例如,打开以前的 LFS 文件以确保它们没有损坏)和运行您的构建以确保一切正常。

提示

  • 运行 在区分大小写的文件系统上,以防在某些时候发生文件系统冲突(例如 ./LICENSE 和 ./License)。
  • Git 删除所有 .gitattributes 中的所有 filter=lfs 行。
  • 您可能还想删除留在 .git/hooks 目录中的 LFS:预提交、post-提交、post-检出、post-合并。
  • 对于$GIT_TRACE=1应该没有...trace git-lfs: filepathfilter: accepting...
  • 的迹象

根据Shadow的回答,我修改了整个历史更新。 对于那些不想保留 LFS 文件的人(在我的情况下我没有,因为它们会很大)。

使用:

GIT_LFS_SKIP_SMUDGE=1 git filter-branch -f --prune-empty --tree-filter '
  git lfs checkout
  git lfs ls-files | cut -d " " -f 3 | xargs rm -f
  git rm -f --ignore-unmatch .gitattributes
' --tag-name-filter cat -- --all

当提交中没有 .gitattributes 时,它也不会失败,在我的情况下,所有提交都不是这样。

此外,repo 没有存储在远程的原始 LFS 文件,因此使用 GIT_LFS_SKIP_SMUDGE=1

这样回购不包括任何 LFS 参考和文件,这使得克隆回购更快更轻 - 这是我的目标。大文件无论如何都用于测试,但由于代码已经改进了很多,运行那些旧的测试是无关紧要的。