如何检查所有 git-lfs 跟踪和提交的文件都是指针?

How to check that all git-lfs tracked and committed files are pointers?

由于 git-lfs 需要一些手动设置(安装 git-lfs,运行 git lfs install 一次)这可能导致开发人员不提交 git-lfs 正确跟踪文件类型。我想在我们的持续集成系统上检查拉取请求。

如何检查所有 git-lfs 跟踪和提交的文件都是指针? There is a check 即 运行 例如变基时但这不能作为 cli 命令使用。

我想要这样的东西:

$ git clone https://...
$ [git lfs check-for-pointers]
Encountered 35 file(s) that should have been pointers, but weren't:
    file1.png
    ...

Git LFS 没有办法在本地执行此操作,但如果您希望看到对它的支持,您可以在 GitHub 存储库上打开一个问题。同时,您可以使用如下技术实现此目的:

git ls-files | git check-attr --stdin filter | \
awk -F': ' ' ~ /lfs/ { print }' | \
xargs -L1 sh -c 'git cat-file blob "HEAD:[=10=]" | \
    git lfs pointer --check --stdin || { echo "[=10=]"; false; }'

如果此命令产生任何输出,则存在无效的指针文件,它应该打印出它是哪个文件。如果一切正常,它也会退出零,如果文件损坏,它也会退出非零。

这确实有一个限制,即它不处理其中带有冒号-space 或换行符的文件名;如果那很重要,你将不得不使用 -z 选项和 运行 东西通过 perlruby 而不是 awk.

这是一个可能会更快一点的替代解决方案:

rm .git/index && ! git reset --hard HEAD 2>&1 | grep 'that should have been pointers'

请注意,此解决方案将删除尚未提交的数据。

对于那些不扫描下面评论的人;)

除了 bkk2204(git ls-files -z 用于文件名中的空格和其他奇怪的字符)并感谢来自 github

的 calve
git ls-files -z | git check-attr --stdin -z filter | \
perl -n0 -e 'chomp; push @x, $_; if (@x == 3) { print "$x[0]$/" if $x[2] eq "lfs"; @x=(); }' | \
xargs -0 -L1 --no-run-if-empty sh -c 'git cat-file blob "HEAD:[=10=]" | git lfs pointer --check --stdin || { echo [=10=]; false; }'

你可能会注意到