我想列出 .gitignore 未忽略的所有文件,即我的存储库的所有源文件。
ag
默认情况下效果很好,但我不知道有一种方法可以在不安装额外软件的情况下工作。
不带选项的 git ls-files
几乎可以正常工作,但没有考虑已修改/创建的文件,例如,如果我创建一个新文件栏而不提交它,git ls-files
不会显示该文件。
git status --short| grep '^?' | cut -d\ -f2-
将为您提供未跟踪的文件。
如果将其与
git ls-files
合并,您将获得所有未忽略的文件:
( git status --short| grep '^?' | cut -d\ -f2- && git ls-files ) | sort -u
然后您可以按
进行过滤( xargs -d '\n' -- stat -c%n 2>/dev/null ||: )
仅获取可统计的文件(==在磁盘上)。
这是另一种方法,使用
git check-ignore
,你可能会发现它更干净:
find . -type f
将为您提供当前文件夹中的所有文件。
find . -type f -not -path './.git/*'
将为您提供所有文件,但 .git 文件夹中的所有文件除外,您绝对不想包含这些文件。那么,
for f in $(find . -type f -not -path './.git/*'); do echo $f; done
与上面相同。只是为下一步做准备,介绍条件。这个想法是使用
git check-ignore -q
当路径被忽略时返回退出 0。因此,这是完整的命令
for f in $(find . -type f -a -not -path './.git/*'); do
if ! $(git check-ignore -q $f); then echo $f; fi
done
git ls-files --cached --others --exclude-standard
将为您提供您想要的信息。
--cached
-- 显示 git 知道的文件。 (没有选项的普通git ls-files
相当于通过此选项。)--others
-- 显示 git 不 知道的文件。默认情况下,这包括忽略的文件,但是...--exclude-standard
-- 不要在输出中包含忽略的文件。Uri 的答案的较短变体:
find . -not -path ./.git/\* -type f -exec git check-ignore -q {} \; -print
find . -not -path ./.git/\* -type f -not -exec git check-ignore -q {} \; -print
-t
选项显示表示文件状态的“标签”,“R”表示文件已被删除。 如果我们排除带有“R”和非“R”行的文件,我们就会得到我们想要的。
git ls-files -dcmot | sed "s/^[HSMCK?U]/X/" | uniq | sed "s/^R/X/" | uniq -u | sed "s/^X //"