我在使用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的,将它们转换成它们对应的目标文件。
git lfs ls-files。filter=lfs行.gitattributes。.gitattributes可以住在任何地方,因此请确保找到所有这些,否则以后可能会导致迁移问题。.gitattributes。git status.git lfs migrate export --everything --include .git status以确保您没有任何更改。如果你离开了.gitattributes,filter=lfs你现在可能会错误地进行更改。git lfs ls-files.filter=lfs行.gitattributes。.git/hooks目录中:pre-commit、post-commit、post-checkout、post-merge。$GIT_TRACE=1不应有任何的迹象...trace git-lfs: filepathfilter: accepting...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,而是将实际文件添加到索引中。
完成上述操作后,您将需要进行推力操作。自然,这会将所有其他在您的存储库上工作的人置于分离的头部状态-因此在代码冻结期间执行此操作是明智的。之后,让每个人都进行新的克隆可能是最容易的。