我有一个项目,我用 Git LFS 存储视频文件。现在,我的构建服务器遇到了一些复杂问题,它还不支持 Git LFS。由于它是一个外部服务,我不能真正影响构建过程,因此希望将文件从 Git LFS 下移回“常规”Git。我设法取消跟踪文件类型,git lfs untrack '<file-type>'
但git lfs ls-files
仍然给出了以前添加的文件的列表。
我想我可以删除文件,推送更改,然后手动重新添加它们,但这真的是推荐的做事方式吗?
我最近遇到了这个问题,资产被意外添加到一个不应该存在的分支上的 git-lfs 中。我的解决方案是:
git lfs untrack '<file-type>'
git rm --cached '<file-type>'
git add '<file-type>'
git commit -m "restore '<file-type>' to git from lfs"
结果是使用标准文件内容重写了 git-lfs oid sha256 指针。
(编辑 2019-03):接受的答案已更改,以便为更简单的情况提供简单的解决方案。如果您手头有更复杂的案例,另请参阅VonC 答案中的编辑以获取替代解决方案。
从 Git 2.16(2018 年 1 月 17 日发布)开始,您可以使用以下--renormalize
标志轻松完成此操作git add
:
git lfs untrack '<pattern>'
git add --renormalize .
git commit -m 'Restore file contents that were previously in LFS'
来自Git 的文档:
--renormalize:对所有跟踪的文件重新应用“清理”过程,以强制将它们再次添加到索引中。
core.autocrlf
这在更改配置或属性后很有用text
,以便更正添加了错误 CRLF/LF 行结尾的文件。该选项暗示-u
.
这里的关键部分是“所有跟踪的文件”。通常,过滤器仅在 Git 操作更改工作树中的文件时运行。更改 LFS 白名单.gitattributes
不是 Git 操作,因此在您运行git lfs untrack
. Runninggit add --renormalize .
告诉 Git 对存储库中的每个文件重新运行过滤器,以确保所有应该在 LFS 中的文件都在 - 而所有不应该在的文件都不在。
第 641 期提到了同样的问题。
我试图停止使用 Git LFS,但发现无法使用
git lfs uninit
,git lfs untrack
,git rm
... 恢复我以前跟踪的指针文件,在我将这些文件移回后,它仍然列出 Git LFS 跟踪git lfs ls-files
,我如何选择退出整个 Git LFS我回购的东西?
答案是:
- 删除所有 filter.lfs.* git config 条目
git lfs uninit
。- 通过为每种文件类型
.gitattributes
运行来清除任何使用 lfs 过滤器的属性,或者如果您曾经使用过 LFS,则删除它。git lfs untrack
.gitattributes
在此之后,任何添加的文件都将直接进入 git。
但这并不是那么简单:
.git/lfs
我后来在我的工作目录中结束了 LFS 指针文件,并且必须手动使用存储在这些指针中的 sha1 哈希来恢复我的所有图片。
2016 年 3 月更新,问题 957说明了一个可能的解决方案tstephens619
:
我犯了同样的错误,将几种小图形格式包含在我的
git lfs
跟踪列表中。
通过执行以下操作,我能够将这些文件移回 git:
创建当前正在跟踪的所有文件的列表
git-lfs
,过滤掉*.gz
并且*.rpm
(我仍想使用 跟踪这些扩展名git-lfs
)git lfs ls-files | grep -vE "\.gz|\.rpm$" | cut -d ' ' -f 3 > ~/temp/lfs-files.txt
停止跟踪小图形文件
git lfs untrack "*.tts" git lfs untrack "*.bfx" git lfs untrack "*.ttf" git lfs untrack "*.xcf" git lfs untrack "*.pkm" git lfs untrack "*.png"
暂时未初始化
git-lfs
git lfs uninit # Git LFS 2.x+ git lfs uninstall
使用文件列表触摸每个文件:
cat ~/temp/lfs-files.txt | xargs touch
git status
现在将显示每个文件已修改
添加对 git index 的更改(我是通过 完成的
git gui
)提交更改,然后重新初始化 git-lfs
git commit git lfs init
维护者ttaylorr
补充道:
一种方法是:
for file in $FILES_TO_REVERT; do
git lfs untrack "$file";
git rm --cached "$file";
git add --force "$file";
done
git commit -m "..."
我的偏好是不要将命令添加到 Git LFS 以达到上述效果,因为 Git 和 Git LFS 提供的瓷器命令可以通过多种不同的方式
编辑:在成功使用 GIT LFS 几年后,以及对该答案的一些赞成/反对票,我认为这个警告仍然适用: GIT LFS 有很多缺陷,例如难以管理哪些文件应该在LFS,在 Windows 上(意外)向 LFS 添加许多小文件时的性能问题,对多个远程和远程 URL 格式的支持有限,从 LFS 中删除文件困难,合并时可能遇到的各种问题,等等。GIT LFS 是一个外来元素在修订树之外存在的 GIT 中。但是,我想将我原来的警告改写如下:
.gitattributes
先合并。编辑:这是我原来的答案:
很难从 GIT LFS 中删除任何内容,尽管此处介绍的解决方案可能有效(经过修改),但它们需要大量工作并且可能对您的存储库产生副作用。
如果你来到这里,是时候问问自己是否想用 GIF LFS 来管理你的大文件,以及 GIT 本身(它天生不擅长管理大文件,因为它是一个分布式版本控制系统)是否是一个不错的选择。
如果你有很多大文件,并且你是一个单一的组织来处理你的项目,那么像 Subversion 这样的东西可能更适合你。
我在 Windows 中执行步骤时遇到问题。要删除所有 git lfs 跟踪的文件并恢复原始文件,我在 git bash 中执行了以下操作:
删除 .gitattributes
git lfs ls-files | cut -d ' ' -f 3 > lfs-files.txt
执行以下代码段:
片段:
while read file; do
git lfs untrack "$file";
git rm --cached "$file";
git add --force "$file";
done <lfs-files.txt
我尝试并能够根据他们的官方文档成功使用以下命令将我的 repo 恢复为常规 repo:
git lfs migrate export --include="*.psd" --everything
希望这对处于相同情况的任何人有用!