我有一个项目,其中使用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指针进行重写,使用标准文件内容。
自 Git 2.16 版本(发布于2018年1月17日),您可以使用 git add
命令的 --renormalize
标志来轻松完成此操作:
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操作更改工作树中的文件时才会运行过滤器。在.gitattributes
中更改LFS白名单不是Git操作,因此在运行git lfs untrack
后,索引处于不一致状态。运行git add --renormalize .
告诉Git重新运行每个文件上的过滤器,这可以确保所有应该在LFS中的文件都在其中,而所有不应该在其中的文件则不会被添加。
Issue 641提到了相同的问题。
我试图停止使用Git LFS,但无法通过
git lfs uninit
、git lfs untrack
、git rm
等方法恢复先前跟踪的指针文件。即使我将这些文件移回原位,它们仍会在git lfs ls-files
中被列为由Git LFS跟踪。如何从我的repo中退出整个Git LFS?
答案是:
- 使用
git lfs uninit
删除所有filter.lfs.* git config条目。- 通过运行
git lfs untrack
来清除任何使用lfs过滤器的属性,或者如果LFS是您唯一使用它的内容,则删除.gitattributes
。
这样做后,任何添加的文件都将直接进入git。
但事实并不简单:
后来我发现在我的工作目录中出现了LFS指针文件,并不得不手动使用那些指针中存储的sha1哈希从
.git/lfs
中恢复所有图片。
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索引中(我通过
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
,只要跟踪设置正确就可以了。 - Olli Niskanen我在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
cut -f
的更广泛解释。 - Jokergit lfs migrate export --include="*.psd" --everything
原始官方文档的链接在https://github.com/git-lfs/git-lfs/blob/main/docs/man/git-lfs-migrate.adoc#migrate-local-history。
希望这对于处于相同情况的任何人都有用!
.gitattributes
已正确设置以跟踪我想要的文件,这个解决方案将非常有效。比其他发布的解决方案简单得多。 - Josh Rickertgit lfs checkout <file1> <file2> <file3>
,然后按照这里的步骤操作。 - hackerb9