我有一个项目,我用Git LFS存储视频文件。现在我遇到了一些不支持Git LFS的构建服务器的并发症。由于它是一个外部服务,我不能真正影响构建过程,因此希望将文件从Git LFS下移回“常规”Git。我设法用git lfs untrack '<file-type>'
取消了文件类型,但git lfs ls-files
仍然提供了之前添加的文件列表。
我想我可以删除文件,推送更改然后手动重新添加它们,但这是否真的是推荐的做事方式?
答案 0 :(得分:48)
我刚刚遇到这个问题,资产被意外地添加到一个分支上的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):已接受的答案已更改,以便为更简单的案例提供简单的解决方案。如果您手头有更复杂的案例,请参阅edits in the answer by VonC了解替代解决方案。
答案 1 :(得分:29)
Issue 641提到同样的问题。
我试图停止使用Git LFS,但是我找不到使用
git lfs uninit
,git lfs untrack
,git rm
恢复之前跟踪的指针文件...之后我将这些文件移回去了仍然列出由Git LFS跟git lfs ls-files
跟踪的,如何从我的回购中选择退出整个Git LFS的东西?
答案是:
- 使用
git lfs uninit
删除所有filter.lfs。* git config条目。- 通过为每种文件类型运行
醇>.gitattributes
清除在git lfs untrack
中使用lfs过滤器的任何属性,或者如果您使用LFS,则删除.gitattributes
。
在此之后,任何添加的文件都会直接进入git。
但这不是那么简单:
我后来在我的工作目录中结束了LFS指针文件,并且必须使用手动存储在这些指针中的sha1哈希从
.git/lfs
恢复我的所有图片。
2016年3月更新,issue 957说明tstephens619
可能的解决方案:
我犯了同样的错误,即将几种小图形格式包含在我的
git lfs
跟踪列表中 我可以通过执行以下操作将这些文件移回git:
创建
git-lfs
当前正在跟踪的所有文件的列表,过滤掉*.gz
和*.rpm
(我仍希望使用{{1}跟踪这些扩展名})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 index(我是通过
git status
完成的)提交更改,然后重新初始化git-lfs
git gui
这样做的一种方法是:
git commit
git lfs init
我的偏好是不要将命令添加到Git LFS以达到上述效果,因为它可以通过Git和Git LFS提供的瓷器命令以多种不同方式实现
答案 2 :(得分:5)
As of Git 2.16 (released Jan 17th, 2018), you can do this easily with the --renormalize
flag of git add
:
git lfs untrack "<pattern>"
git add --renormalize .
git commit -m "Restore file contents that were previously in LFS"
From Git's documentation:
--renormalize: Apply the "clean" process freshly to all tracked files to forcibly add them again to the index. This is useful after changing
core.autocrlf
configuration or thetext
attribute in order to correct files added with wrong CRLF/LF line endings. This option implies-u
.
The key part here is "all tracked files". Normally, filters are only run when a Git operation changes a file in the work tree. Changing the LFS whitelist in .gitattributes
isn't a Git operation, and so the index end up in an inconsistent state after you run git lfs untrack
. Running git add --renormalize .
tells Git to re-run filters on every file in the repository, which ensures that all files which should be in LFS are—and that all files which shouldn't be aren't.
答案 3 :(得分:1)
我在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
答案 4 :(得分:-3)
您无法从GIT LFS中删除任何内容,虽然此处提供的解决方案可能有效(经过修改),但它们需要付出很多努力,并且可能会对您的存储库产生副作用。
如果你到了这里,是时候问问自己是否要用GIF LFS管理你的大文件,以及GIT本身(管理大文件本身就不好,因为它是一个分布式版本控制系统)是一个不错的选择。
如果您有许多大型文件而且您是一个处理项目的组织,那么像Subversion这样的东西可能会更适合您。