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

时间:2017-11-02 09:54:03

标签: git continuous-integration pull-request git-lfs

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

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

我想有这样的事情:

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

3 个答案:

答案 0 :(得分:4)

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

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

如果此命令产生任何输出,则说明存在无效的指针文件,并且应该打印该文件。如果一切正常,它还将退出零,如果文件损坏则退出零。

这确实有一个限制,即它不能处理其中带有冒号或换行符的文件名;如果那很重要,则必须使用-z选项,并通过perlruby而不是awk来运行。

答案 1 :(得分:0)

这是另一种可能更快的解决方案:

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

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

答案 2 :(得分:0)

对于那些没有在答案下方扫描评论的人;)

除了 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:$0" | git lfs pointer --check --stdin || { echo $0; false; }'

你可能会注意到

  • -L 中的 xargs 选项由 findutils 软件包支持