如何禁用 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 的任何其他人陷入一种超然的头脑状态——所以在代码冻结期间这样做是明智的。之后,让每个人都做一个新的克隆可能是最容易的。
对于特定文件
- 从
.gitattributes
中删除 file/pattern
- 转到文件目录 运行
touch myfile.bin
- 提交并推送更改
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.
示例工作流程
- 确认您确实拥有
git lfs ls-files
. 的 LFS 文件
- 从您的存储库中的所有
.gitattributes
文件中删除所有 filter=lfs
行。 .gitattributes
可以在任何地方生活,因此请确保找到所有的人,否则这可能会在以后导致迁移问题。
- 提交您对
.gitattributes
所做的任何更改。
- 确保
git status
没有变化。
- 运行 迁移:
git lfs migrate export --everything --include .
- 运行
git status
以确保您没有任何更改。如果您将 .gitattributes
保留为 filter=lfs
,您现在可能有错误的更改。
- 验证之前列出的所有 LFS 文件不再与
git lfs ls-files
一起出现。
- 检查文件(例如,打开以前的 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 参考和文件,这使得克隆回购更快更轻 - 这是我的目标。大文件无论如何都用于测试,但由于代码已经改进了很多,运行那些旧的测试是无关紧要的。
我在 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 的任何其他人陷入一种超然的头脑状态——所以在代码冻结期间这样做是明智的。之后,让每个人都做一个新的克隆可能是最容易的。
对于特定文件
- 从
.gitattributes
中删除 file/pattern
- 转到文件目录 运行
touch myfile.bin
- 提交并推送更改
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.
示例工作流程
- 确认您确实拥有
git lfs ls-files
. 的 LFS 文件
- 从您的存储库中的所有
.gitattributes
文件中删除所有filter=lfs
行。.gitattributes
可以在任何地方生活,因此请确保找到所有的人,否则这可能会在以后导致迁移问题。 - 提交您对
.gitattributes
所做的任何更改。 - 确保
git status
没有变化。 - 运行 迁移:
git lfs migrate export --everything --include .
- 运行
git status
以确保您没有任何更改。如果您将.gitattributes
保留为filter=lfs
,您现在可能有错误的更改。 - 验证之前列出的所有 LFS 文件不再与
git lfs ls-files
一起出现。 - 检查文件(例如,打开以前的 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 参考和文件,这使得克隆回购更快更轻 - 这是我的目标。大文件无论如何都用于测试,但由于代码已经改进了很多,运行那些旧的测试是无关紧要的。