如何禁用git-lfs?

Sha*_*dow 7 git git-lfs

我在使用LFS的bitbucket上有一个存储库。自使用了一段时间以来,我决定将存储库移回我控制的空间。首先使用LFS的唯一原因是有效地增加了存储库大小限制(因为LFS中的文件位于单独的存储桶中),但是现在我要移动它,因此不再需要这样做。

我需要一种方法来遍历整个git历史记录,删除git LFS所做的工作的所有痕迹(以便所有文件均“正常”提交)。完成此操作后,我打算强制推送到新的存储库。

我已经做了很多搜索,遇到了建议的解决方案,但是由于它们是高级的,所以我不知道如何实现/运行它们。

我如何向git LFS告别?

Dou*_*son 22

git lfs migrate export

来自git lfs migrate help

出口

出口模式迁移的Git LFS指针文件存在于历史的Git Git的出LFS的,将它们转换成它们对应的目标文件。

示例工作流

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

提示

  • 在区分大小写的文件系统上运行,以防您在某些时候遇到文件系统冲突(例如 ./LICENSE 和 ./License)。
  • 从 .git 文件中删除所有filter=lfs.gitattributes
  • 您可能还想删除 LFS 保留在.git/hooks目录中:pre-commit、post-commit、post-checkout、post-merge。
  • 随着$GIT_TRACE=1不应有任何的迹象...trace git-lfs: filepathfilter: accepting...

  • 您可能还想删除`.git/hooks`目录中的LFS保留:`pre-commit`、`post-commit`、`post-checkout`、`post-merge`。使用 `$GIT_TRACE=1` 应该没有任何迹象 `...trace git-lfs: filepathfilter: 接受...` (3认同)
  • 执行此操作并推送后,我得到“提示:更新被拒绝,因为当前分支的提示位于提示:其远程对应项后面”。在再次推送之前集成远程更改(例如提示:“git pull ...”)。提示:有关详细信息,请参阅“git push --help”中的“有关快进的注释”。当我尝试拉取时,我得到了“致命:拒绝合并不相关的历史记录”。不知道我做错了什么。 (3认同)
  • 所以这太棒了。工作得非常好,而实际 git lfs 文档中提供的简单说明...没有那么多。你能解释一下为什么--include后面要加点吗?我一直认为这必须是某种表达方式,但是当我基本上使用 .gitattributes 中的内容时,它根本不起作用。 (2认同)
  • 如果(例如在 Github Desktop 上)它说你的本地提交与远程提交不同,你该怎么办?我应该将导出的存储库视为全新的存储库吗? (2认同)

Sha*_*dow 10

仅更新当前提交

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

git lfs uninstall
touch **/*
git commit -a
Run Code Online (Sandbox Code Playgroud)

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

更新整个历史

这对我有用-但是会引发很多错误(我认为每次未将文件添加到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
Run Code Online (Sandbox Code Playgroud)

它卸载git LFS支持(从理论上防止LFS破坏索引),然后确保每次提交都正确检出LFS文件,然后全部触摸它们(因此git意识到它们已更改),并删除了在.gitattributes这样在克隆时就不会继续尝试使用LFS,而是将实际文件添加到索引中。

完成上述操作后,您将需要进行推力操作。自然,这会将所有其他在您的存储库上工作的人置于分离的头部状态-因此在代码冻结期间执行此操作是明智的。之后,让每个人都进行新的克隆可能是最容易的。