在常规Git下移动Git LFS跟踪文件

Oll*_*nen 53 git git-lfs

我有一个项目,我用Git LFS存储视频文件.现在我遇到了一些不支持Git LFS的构建服务器的并发症.由于它是一个外部服务,我不能真正影响构建过程,因此希望将文件从Git LFS下移回"常规"Git.我设法解决了文件类型,git lfs untrack '<file-type>'git lfs ls-files仍然提供了以前添加的文件列表.

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

mre*_*red 65

我刚刚遇到这个问题,资产被意外地添加到一个不应该的分支上的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"
Run Code Online (Sandbox Code Playgroud)

结果是重写了带有标准文件内容的git-lfs oid sha256指针.

  • 正确设置`.gitattributes`以跟踪我想要的文件,这个解决方案运行得很漂亮.比发布的其他一些解决方案简单得多. (3认同)
  • @OlliNiskanen 虽然很高兴被标记为接受的答案,但我觉得重要的是要注意,虽然这是针对所提出的特定问题的一个很好且简单的解决方案,但对于更复杂的情况,读者应该参考编辑中建议的批处理方法tstephens619 和 ttaylorr 对 VonC 的回答。 (3认同)
  • 18 年为我工作。给其他人的提示:“文件类型”是“**.jpg” (2认同)
  • @mred,同意。我建议编辑链接到先前接受的答案。这个答案被埋没了,人们发现它很有帮助,所以我觉得这应该成为访问者看到的第一件事。 (2认同)

Von*_*onC 30

问题641提到了同样的问题.

我试图阻止使用Git LFS,却发现没办法使用恢复我以前的跟踪指针文件git lfs uninit,git lfs untrack,git rm...在我移动这些文件备份它仍然列出了Git的LFS与所跟踪git lfs ls-files的,我怎么能退出整个LFS的Git来自我的回购的东西?

答案是:

  1. 删除所有filter.lfs.*git config条目git lfs uninit.
  2. .gitattributes通过git lfs untrack为每种文件类型运行来清除使用lfs过滤器的任何属性,或者删除.gitattributesLFS是您曾经使用过的所有属性.

在此之后,任何添加的文件将直接进入git.

但这不是那么简单:

我后来在我的工作目录中结束了LFS指针文件,并且必须.git/lfs使用手动存储在这些指针中的sha1哈希恢复我的所有图片.


2016年3月更新,问题957说明了一种可能的解决方案tstephens619:

我犯了同样的错误,将几种小图形格式包含在我的git lfs跟踪列表中.
我可以通过执行以下操作将此文件移回git:

git status 现在将显示每个文件已修改


维护者ttaylorr补充说:

一种方法是:

for file in $FILES_TO_REVERT; do
  git lfs untrack "$file";
  git rm --cached "$file";
  git add --force "$file";
done

git commit -m "..."
Run Code Online (Sandbox Code Playgroud)

我的偏好是不会向Git LFS添加一个命令以达到上述效果,因为它可以通过Git和Git LFS提供的瓷器命令以多种不同的方式实现.

  • 感谢您从项目中找到正确的问题。尽管如此,即使此解决方案也需要手动移动文件。当从Git到Git LFS的工作流基本上是`git rm --cached &lt;file&gt;`-&gt;`git add &lt;file&gt;`-&gt;`git commit`时,只要您正确设置了跟踪,似乎有点奇怪。 (2认同)
  • 我对此发布了一个新问题:https://github.com/github/git-lfs/issues/957 (2认同)
  • 我的LFS版本(2.0.2)没有`uninit`命令.而不是`git lfs uninit`我不得不使用`git lfs uninstall`. (2认同)

Tom*_*ebb 11

从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'
Run Code Online (Sandbox Code Playgroud)

Git的文档中

--renormalize:对所有跟踪的文件重新进行“干净”处理,以将其再次强制添加到索引中。更改core.autocrlf配置或text属性后,此功能很有用,以便更正添加有错误CRLF / LF行尾的文件。此选项暗示-u

这里的关键部分是“所有跟踪的文件”。通常,仅当Git操作更改工作树中的文件时才运行过滤器。更改LFS白名单.gitattributes不是Git操作,因此在您运行后,索引最终会处于不一致状态git lfs untrack。运行git add --renormalize .告诉Git对存储库中的每个文件重新运行过滤器,以确保应该在LFS中的所有文件都存在,并且应该不应该。

  • 这种方法的好处是,如果您从过去或另一个分支检出,旧的 lfs 内容仍然存在。但今后它将不再使用 lfs。我要添加的一件事是现在从 .gitattributes 中删除 lfs 内容(或者在我的情况下删除整个文件)并检查它。 (3认同)
  • 应该注意的是,这不会改变历史记录,这意味着如果您签出较旧的提交,您可能会得到指向 LFS 而不是实际文件的指针。如果您已经移动了存储库或删除了 LFS,您将无法通过这种方式取回那些旧的大文件。 (3认同)

Flo*_*ter 8

编辑:在成功使用 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 中删除任何内容都很困难,尽管这里提供的解决方案可能有效(经过修改),但它们需要大量的努力,并且可能会对您的存储库产生副作用。

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

如果您有许多大文件,并且您是一个致力于项目的组织,那么 Subversion 之类的工具可能更适合您。

  • @ericfrazer 对这个问题的每次访问都证明了我的观点,因为按照 GIT LFS 的官方文档,从 LFS 中删除文件应该是理所当然的。但事实并非如此,因为它不起作用。人们正在苦苦挣扎,因为 a) 很难微调要添加的文件 b) 添加许多小文件在 Windows 上会出现性能问题,因为 GIT LFS 作为子进程运行,并且启动子进程的成本非常昂贵叉()。底线:为了您自己的精神理智,在所有问题都解决之前不要使用 LFS。这种情况已经很多年没有发生过了... (8认同)

Jok*_*ker 5

我在 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
Run Code Online (Sandbox Code Playgroud)