列出未被Git LFS跟踪的文件

11

我正在使用Git LFS初始化一个包含大量文件的新Git存储库。在进行第一次提交之前,我想确保我已经告诉LFS跟踪应该处理的所有文件。

我看到git lfs ls-files会列出所有被LFS跟踪的文件。然而,(a) 我想要相反的:所有在存储库中未被LFS跟踪(并且在.gitignore中)的文件,以及(b)此命令仅在提交文件之后才起作用。

是否有人能够提供一些git-fu或Ubuntu-fu来列出存储库中所有未被忽略且未与Git LFS使用的各种.gitattribute文件的跟踪模式匹配的文件?


最接近的方法是使用这个命令列出仓库中超过100kB的文件,然后手动扫描所有文件,并希望它们被跟踪模式所覆盖。
find . -type f -exec du -Sha -t 100000 {} +
2个回答

13
即使问题涉及未提交的文件,我还是建议一种解决方案,用于列出被Git跟踪但不被Git LFS跟踪的文件(提交后)。您可以通过将由git跟踪的文件列表(git ls-files)与那些由git-lfs跟踪的文件列表连接起来(git lfs ls-files | cut -d' ' -f3-),然后只选择此列表中唯一的文件:
{ git ls-files && git lfs ls-files | cut -d' ' -f3-; } | sort | uniq -u

如果你发现有一个文件混进来了,你可以编辑你的提交(git rm --cachedgit commit --amend)。

在预提交阶段,通过观察未跟踪的文件列表,并依次使用git lfs trackgit add应该是相当安全的。

请注意,根据规范,空文件不被视为LFS对象,因此它们将不会在git lfs ls-files中列出。


cut命令(-f3)中的范围应该是-f3-,以防路径中有空格。 - Grimeh
一个 git-alias 版本的命令,无论你在 git 仓库的目录结构中的哪个位置都可以使用:lfs-untracked = "!_() { ((git ls-files | egrep \"^${GIT_PREFIX}\") && (git lfs ls-files ${GIT_PREFIX:+-I ${GIT_PREFIX}} | cut -d' ' -f3-)) | sort | uniq -u ; }; _" - crimson-egret
1
按文件大小排序:({ git ls-files && git lfs ls-files | cut -d' ' -f3-; } | sort | uniq -u) | xargs stat -c '%s %n' | numfmt --to=iec | sort -h - Martin Valgur

1

让我提供一些想法:

获取存储库中所有文件的列表:

find . -type f > all.txt

获取LFS跟踪的所有文件列表:
set -f; for f in $(cat .gitattributes | cut -d ' ' -f 1); do find . -name $f; done > lfs.txt

要获取所有不会被LFS跟踪的文件列表:
grep -f lfs.txt -F -w -v all.txt > non-lfs.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接