Git命令显示哪些特定的文件被.gitignore忽略

我在git上弄湿了我的脚,并且遇到以下问题:

我的项目源代码树:

/ | +--src/ +----refs/ +----... | +--vendor/ +----... 

我在我的供应商分支中有代码(目前是MEF),我将在那里编译,然后将引用移动到/src/refs ,这是项目从中select它们的地方。

我的问题是我有我的.gitignore设置为忽略*.dll*.pdb 。 我可以做一个git add -f bar.dll强制添加被忽略的文件,这是好的,问题是我无法弄清楚哪些文件存在被忽略。

我想列出被忽略的文件,以确保我不会忘记添加它们。

我已经阅读了关于git ls-files的手册页,并且无法使其工作。 在我看来, git ls-files --exclude-standard -i应该做我想要的。 我错过了什么?

更新:

git ls-files -i将无法正常工作,您将收到错误消息:

 ls-files: --ignored needs some exclude pattern 

git ls-files --others -i --exclude-from=.git/info/exclude VonC下面的build议确实是答案。 --exclude-standard选项也可以替代--exclude-from

什么工作总结:

 git ls-files --others -i --exclude-from=.git/info/exclude git ls-files --others -i --exclude-standard 

笔记:

  • 小白的回答比较简单(git1.7.6 +): git status --ignored
    (如“ 有没有办法告诉git-status忽略.gitignore文件的影响? ”)
  • MattDiPasquale的答案 (被upvoted) git clean -ndX适用于旧的gits,显示什么被忽略的文件可以被删除的预览 (不删除任何东西)

还有一点很有意思(在qwertymk的回答中提到),至less在Unix上也可以使用git check-ignore -v命令(在CMD Windows会话中不能很好地工作)

 git check-ignore * git check-ignore -v * 

第二个显示.gitignore的实际规则,使您的git .gitignore中的文件被忽略。
在Unix上,使用“ 什么扩展到当前目录中的所有文件recursion? ”和一个bash4 +:

 git check-ignore **/* 

(或find -exec命令)


原始答案42009)

 git ls-files -i 

应该工作,除了源代码表明:

 if (show_ignored && !exc_given) { fprintf(stderr, "%s: --ignored needs some exclude pattern\n", argv[0]); 

exc_given

事实certificate,在-i之后需要多一个参数来实际列出任何东西:

尝试:

 git ls-files -i --exclude-from=[Path_To_Your_Global].gitignore 

(但那只会列出你的caching (不被忽略)的对象,带有一个filter,所以这不是你想要的)


例:

 $ cat .git/ignore # ignore objects and archives, anywhere in the tree. *.[oa] $ cat Documentation/.gitignore # ignore generated html files, *.html # except foo.html which is maintained by hand !foo.html $ git ls-files --ignored \ --exclude='Documentation/*.[0-9]' \ --exclude-from=.git/ignore \ --exclude-per-directory=.gitignore 

其实,在我的'gitignore'文件(称为“排除”),我find一个命令行可以帮助你:

 F:\prog\git\test\.git\info>type exclude # git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ 

所以….

 git ls-files --others --ignored --exclude-from=.git/info/exclude git ls-files -o -i --exclude-from=.git/info/exclude git ls-files --others --ignored --exclude-standard git ls-files -o -i --exclude-standard 

应该做的伎俩。

正如在ls-files手册页中提到的那样, -为了向您展示非caching的,未提交的,通常被忽略的文件, --others部分是非常重要的部分。

--exclude_standard不仅仅是一个快捷方式,而是一种包含所有标准“忽略模式”设置的方法。

exclude-standard
在每个目录中添加标准的git排除项: .git/info/exclude.gitignoreuser's global exclusion file

另一个选项很干净(没有双关语意)。

 git clean -ndX 

说明:

 $ git help clean git-clean - Remove untracked files from the working tree -n, --dry-run - Don't actually remove anything, just show what would be done. -d - Remove untracked directories in addition to untracked files. -X - Remove only files ignored by git. 

注意:此解决scheme不会显示已被“清除”的忽略文件。

编辑:

这种方法可能不会捕获所有被git status忽略的文件。 看这里的例子。

有一个更简单的方法来做到这一点(混帐1.7.6 +):

git status --ignored

请参阅有没有办法告诉git-status忽略.gitignore文件的影响?

虽然通常正确的解决scheme不适用于所有情况。 假设这样的回购目录:

 # ls **/* doc/index.html README.txt tmp/dir0/file0 tmp/file1 tmp/file2 doc: index.html tmp: dir0 file1 file2 tmp/dir0: file0 

和一个像这样的gitignore:

 # cat .gitignore doc tmp/* 

这会忽略doc目录和tmp所有文件。 Git按预期工作,但列出忽略文件的给定命令不会。 让我们看看git有什么要说的:

 # git ls-files --others --ignored --exclude-standard tmp/file1 tmp/file2 

请注意,列表中缺lessdoc 。 你可以得到它:

 # git ls-files --others --ignored --exclude-standard --directory doc/ 

注意附加的--directory选项。

据我所知,没有一个命令一次列出所有被忽略的文件。 但是我不知道为什么tmp/dir0根本不显示。

Git现在已经内置了这个function

 git check-ignore * 

当然,你可以把glob改成类似**/*.dll东西

Git参考

应该足够使用

 git ls-files --others -i --exclude-standard 

因为这涵盖了涵盖的一切

 git ls-files --others -i --exclude-from=.git/info/exclude 

因此后者是多余的。


你可以通过给你的~/.gitconfig文件添加一个别名来~/.gitconfig

 git config --global alias.ignored "ls-files --others -i --exclude-standard" 

现在你可以inputgit ignored来查看列表。 更容易记住,而且input速度更快。

如果你更喜欢Jason Geng的解决scheme的更简洁的显示,你可以像这样添加一个别名:

 git config --global alias.ignored "status --ignored -s" 

但是更详细的输出对于排除.gitignore文件中的问题更有用,因为它列出了被忽略的每个棉签select文件。 你通常会通过grep来pipe理结果,看看你希望被忽略的文件是否在那里,或者你不想被忽略的文件在那里。

 git ignored | grep some-file-that-isnt-being-ignored-properly 

然后,当你只想看一个简短的显示,很容易记住和键入

 git status --ignored 

-s通常可以停止。)

以下是如何在工作树中打印与Git的多个gitignore源代码中的任何位置匹配的文件的完整列表(如果您使用的是GNU find ):

 $ cd {your project directory} \ ; find . -path ./.git -prune -o -print \ | git check-ignore --no-index --stdin --verbose 

它将检查存储库当前分支中的所有文件(除非你已经在本地删除它们)。

它也确定了特定的gitignore源代码行。

Git继续跟踪一些与gitignore模式匹配的文件的变化,只是因为这些文件已经被添加了。 有用的是,上面的命令也显示这些文件。

如果你使用Windows, Git Bash包含GNU find (如find --version )。

如果列表很长(而且你已经有了),那么你也可以通过扩展(有点)来显示它们:

 $ cd {your project directory} \ ; find . -path ./.git -prune -o -print \ | git check-ignore --no-index --stdin --verbose \ | rev | sort | rev 

欲了解更多细节,请看man findman git-check-ignoreman revman sort

假设有几个忽略目录,为什么不使用“git status node / logs /”来告诉你哪些文件将被添加? 在目录中我有一个文本文件,不是状态输出的一部分,例如:

在分支主人
你的分支是最新的“起源/主”。
未logging的文件:
(使用“git add …”来包含将要提交的内容)

  node/logs/.gitignore 

.gitignore是:

*

!的.gitignore