我有一个项目,使用Git LFS存储视频文件。现在,我的构建服务器还不支持Git LFS,遇到了一些麻烦。由于它是一项外部服务,因此我无法真正影响构建过程,因此希望将文件从Git LFS下移回“常规” Git。我设法取消跟踪文件类型,git lfs untrack '<file-type>'
但git lfs ls-files
仍然提供了以前添加的文件的列表。
我想我可以删除文件,推送更改,然后手动重新添加它们,但这真的是推荐的处理方式吗?
我有一个项目,使用Git LFS存储视频文件。现在,我的构建服务器还不支持Git LFS,遇到了一些麻烦。由于它是一项外部服务,因此我无法真正影响构建过程,因此希望将文件从Git LFS下移回“常规” Git。我设法取消跟踪文件类型,git lfs untrack '<file-type>'
但git lfs ls-files
仍然提供了以前添加的文件的列表。
我想我可以删除文件,推送更改,然后手动重新添加它们,但这真的是推荐的处理方式吗?
Answers:
我最近遇到了一个问题,在这个问题上,资产被意外地添加到了一个不应该添加到一个分支上的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答案中的编辑以获取替代解决方案。
问题641提到了同一问题。
我试图停止使用Git LFS,但是找不到使用以下方法还原我以前跟踪的指针文件的方法
git lfs uninit
,git lfs untrack
,git rm
...在我移动这些文件备份它仍然列出了与跟踪的Git的LFSgit lfs ls-files
,我怎么能退出整个LFS的Git回购中的内容?
答案是:
- 使用删除所有filter.lfs。* git config条目
git lfs uninit
。.gitattributes
通过git lfs untrack
为每种文件类型运行来清除所有使用lfs过滤器的属性,或者.gitattributes
如果您使用过LFS,则删除所有属性。
之后,所有添加的文件将直接转到git。
但这不是那么简单:
稍后,我将LFS指针文件保存在工作目录中,并且必须
.git/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 rm --cached <file>
-> git add <file>
-> git commit
,只要您正确设置了跟踪,似乎有点奇怪。
uninit
命令。而不是git lfs uninit
我不得不使用git lfs uninstall
。
从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
。运行git add --renormalize .
告诉Git对存储库中的每个文件重新运行过滤器,以确保应该在LFS中的所有文件都存在,并且应该不应该。
您无法真正从GIT LFS中删除任何内容,尽管此处介绍的解决方案可能有效(经过修改),但它们需要大量的工作,并且可能会对存储库产生副作用。
如果您到达这里,是时候问问自己是否要使用GIF LFS管理大型文件,以及GIT本身(由于它是分布式版本控制系统,对管理大型文件而言本质上很差)是否是一个不错的选择。
如果您有许多大文件,并且您是一个仅从事项目工作的组织,那么Subversion之类的方法可能对您更好。
.gitattributes
正确设置以跟踪我想要的文件,此解决方案效果很好。比发布的其他一些解决方案简单得多。