移除 Git LFS with filter-branch? (无法将未更改的文件重新添加到索引。)

Remove Git LFS with filter-branch? (Can't re-add unchanged file to index.)

正在尝试从 Git LFS 迁移回购(包括历史)。

I 运行 git lfs migrate export --include="*" --everything(提到 here)在测试回购中,但它没有按预期工作,并留下了 LFS 指针文件,而不是将它们全部转换为对象。

我尝试了替代方法,遵循 . Unfortunately it still left pointer files, so I combined it with

最后,我什至运行把所有的命令都放在一起:

git lfs uninstall
git filter-branch -f --prune-empty --tree-filter '
  git lfs fetch
  git lfs checkout
  git lfs ls-files | cut -d " " -f 3 | xargs touch
  git lfs ls-files | cut -d " " -f 3 | xargs git rm --cached
  git rm -f .gitattributes
  git lfs ls-files | cut -d " " -f 3 | xargs git add --force
  git add --renormalize .
' --tag-name-filter cat -- --all

没用。给我多个文件的以下错误,过滤的提交有指针文件而不是对象。

Errors logged to <PATH>
Use `git lfs logs last` to view the log.
Rewrite <COMMIT SHA ####> (2/9) (2 seconds passed, remaining 7 predicted)    
Checking out LFS objects:   0% (0/1), 0 B | 0 B/s           
Checking out LFS objects: 100% (2/2), 3.1 KB | 0 B/s, done
Error updating the git index:
error: picture.png: cannot add to the index - missing --add option?
fatal: Unable to process path picture.png

我只在提示提交上尝试了 运行 相同的命令,看起来 touchrm --cachedadd --renormalize .add --forcegit status 不显示任何修改。所以我无法将 cleaned/pulled 对象文件重新添加到新的提交中。

也许这就是问题所在?那么如何在使用filter-b运行ch时强制重新添加未修改的文件到索引呢?

(使用 Windows 和 git bash。)

  1. 执行 git lfs migrate export --everything --include . 以 git 历史记录中的真实文件替换所有 LFS 指针。有关详细信息,请参阅

  2. 运行 git lfs uninstall 删除 lfs 挂钩。

  3. 并验证 .gitattributes 是否删除了 lfs 过滤器。

    如果未删除 lfs 过滤器,并且如果 .gitattributes 仅用于 LFS,则删除所有历史记录中的文件:

    git filter-branch -f --prune-empty --tree-filter '
      git rm -f .gitattributes --ignore-unmatch
    ' --tag-name-filter cat -- --all
    

    否则,如果 .gitattributes 有非 LFS 行,通过将上面的 tree-filter 命令替换为 git lfs untrack(参考 here and ),仅删除 LFS 过滤器。