从git储存库中删除丢失的LFS对象

时间:2019-04-04 00:44:27

标签: git gitlab git-lfs

我在客户端和服务器上的git仓库*中都缺少一堆LFS对象。我知道这些对象丢失了,没关系。不幸的是,这意味着git lfs fetch --all甚至git lfs push --all origin都会失败。

我想通过使用虚拟文本文件替换二进制文件或完全删除指针来清除存储库中的“损坏的指针”。我也知道这涉及到重写历史记录,这也很好。

什么是最好的进行方式?

*为了澄清,我丢失了服务器上的一些 LFS文件,但不是全部,也不是这些文件的所有修订版。

例如,我有经过3次提交修改的foo.png:

  • foo.png(版本1,LFS Sha:03cfd743)
  • foo.png(版本2,LFS Sha:661f0797)
  • foo.png(Version 3,LFS Sha:5fa2f122)

LFS服务器不再具有foo.png版本2,因此我想从历史记录中删除该提交。不幸的是,git lfs不会告诉我哪个提交被破坏了,它只是告诉我661f0797丢失了。

(记录下来,我发现了丢失的文件,所以我不再遇到这个问题,但是解决方案应该仍然很有趣!)

4 个答案:

答案 0 :(得分:1)

您可以untrack个文件,manual is here

示例:

只需一个文件:

git lfs untrack "/path/to/my-file.gif"

使用通配符,您可以通过一个命令捕获多个文件:

git lfs untrack "*.gif"

答案 1 :(得分:1)

如果您仍在寻找一种方法来查看哪些提交受到影响,请获取缺少的 LFS 对象 ID 并使用此命令查找提交:

git log --source --all -p  -S <LFS-OBJ-ID>

答案 2 :(得分:0)

您是否尝试过简单的操作(在使用以下命令之前建议备份):

rm -f .git/index
git reset

答案 3 :(得分:0)

进行git reindex并为文件创建新条目,请阅读以下内容

git reset [-q] [<tree-ish>] [--] <paths>...
       This form resets the index entries for all <paths> to their state at <tree-ish>. (It does not
       affect the working tree or the current branch.)

       This means that git reset <paths> is the opposite of git add <paths>.

       After running git reset <paths> to update the index entry, you can use git-checkout(1) to check
       the contents out of the index to the working tree. Alternatively, using git-checkout(1) and
       specifying a commit, you can copy the contents of a path out of a commit to the index and to the
       working tree in one go.

source:man git-reset