由于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
...
答案 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
选项,并通过perl
或ruby
而不是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
软件包支持