94

我有一个项目,我用 Git LFS 存储视频文件。现在,我的构建服务器遇到了一些复杂问题,它还不支持 Git LFS。由于它是一个外部服务,我不能真正影响构建过程,因此希望将文件从 Git LFS 下移回“常规”Git。我设法取消跟踪文件类型,git lfs untrack '<file-type>'git lfs ls-files仍然给出了以前添加的文件的列表。

我想我可以删除文件,推送更改,然后手动重新添加它们,但这真的是推荐的做事方式吗?

4

6 回答 6

133

我最近遇到了这个问题,资产被意外添加到一个不应该存在的分支上的 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 答案中的编辑以获取替代解决方案。

于 2017-01-31T15:36:18.453 回答
44

从 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 中的文件都在 - 而所有不应该在的文件都不在。

于 2019-01-09T22:16:53.490 回答
34

第 641 期提到了同样的问题。

我试图停止使用 Git LFS,但发现无法使用git lfs uninit, git lfs untrack, git rm... 恢复我以前跟踪的指针文件,在我将这些文件移回后,它仍然列出 Git LFS 跟踪git lfs ls-files,我如何选择退出整个 Git LFS我回购的东西?

答案是:

  1. 删除所有 filter.lfs.* git config 条目git lfs uninit
  2. 通过为每种文件类型.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 提供的瓷器命令可以通过多种不同的方式

于 2016-01-28T14:27:13.037 回答
3

编辑:在成功使用 GIT LFS 几年后,以及对该答案的一些赞成/反对票,我认为这个警告仍然适用: GIT LFS 有很多缺陷,例如难以管理哪些文件应该在LFS,在 Windows 上(意外)向 LFS 添加许多小文件时的性能问题,对多个远程和远程 URL 格式的支持有限,从 LFS 中删除文件困难,合并时可能遇到的各种问题,等等。GIT LFS 是一个外来元素在修订树之外存在的 GIT 中。但是,我想将我原来的警告改写如下:

  1. 仅将您通常会放入 GIT 的文件放入 GIT LFS(例如,您拥有并偶尔更改的“源文件”)
  2. 仅将大文件放入 GIT LFS。
  3. 如果您需要一个管理二进制依赖项的系统,请考虑使用包管理器。
  4. 不要使用 Subversion 作为 GIT LFS 的替代品。情况更糟。
  5. 准备好弄乱你的工作目录。在对 LFS 进行任何重大更改之前,请确保备份(推送)有价值的更改。
  6. 合并时,总是.gitattributes先合并。

编辑:这是我原来的答案:

很难从 GIT LFS 中删除任何内容,尽管此处介绍的解决方案可能有效(经过修改),但它们需要大量工作并且可能对您的存储库产生副作用。

如果你来到这里,是时候问问自己是否想用 GIF LFS 来管理你的大文件,以及 GIT 本身(它天生不擅长管理大文件,因为它是一个分布式版本控制系统)是否是一个不错的选择。

如果你有很多大文件,并且你是一个单一的组织来处理你的项目,那么像 Subversion 这样的东西可能更适合你。

于 2017-07-28T15:03:59.070 回答
3

我在 Windows 中执行步骤时遇到问题。要删除所有 git lfs 跟踪的文件并恢复原始文件,我在 git bash 中执行了以下操作:

  1. 删除 .gitattributes

  2. git lfs ls-files | cut -d ' ' -f 3 > lfs-files.txt

  3. 执行以下代码段:

片段:

while read file; do
  git lfs untrack "$file";
  git rm --cached "$file";
  git add --force "$file";
done <lfs-files.txt
于 2018-05-28T14:57:40.050 回答
1

我尝试并能够根据他们的官方文档成功使用以下命令将我的 repo 恢复为常规 repo:

git lfs migrate export --include="*.psd" --everything

希望这对处于相同情况的任何人有用!

于 2022-01-21T08:42:39.183 回答