762

我被 Git 弄湿了,有以下问题:

我的项目源代码树:

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

我的供应商分支中有代码(当前为 MEF),我将在那里编译,然后将引用移动到/src/refs项目从中获取它们的位置。

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

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

我已阅读手册页git ls-files,但无法使其正常工作。在我看来,git ls-files --exclude-standard -i应该做我想做的事。我错过了什么?

4

12 回答 12

829

笔记:


也很有趣(在qwertymk回答中提到),您也可以使用该git check-ignore -v命令,至少在 Unix 上(在 CMD Windows会话中不起作用)

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

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

git check-ignore **/*

(或find -exec命令)

注意:https://stackoverflow.com/users/351947/Rafi B.在评论中建议避免(有风险的) globstar

git check-ignore -v $(find . -type f -print)

确保从子文件夹中排除文件.git/

CervEd评论中建议避免.git/

find . -not -path './.git/*' | git check-ignore --stdin

原答案42009)

git ls-files -i

应该可以工作,除了它的源代码表明:

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

exc_given?

事实证明,在-i实际列出任何内容之后,还需要一个参数:

尝试:

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

(但这只会列出带有过滤器的缓存(非忽略)对象,因此这不是您想要的)


例子:

$ 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”文件(称为“排除”)中,我找到了一个可以帮助您的命令行:

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 --ignored --exclude-from=.git/info/exclude
git ls-files -i --exclude-from=.git/info/exclude

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

应该做的伎俩。

(感谢honzajde不包括缓存文件的评论中指出:只有(没有)有。)git ls-files -o -i --exclude-from...git ls-files -i --exclude-from... -o

正如ls-files 手册页中提到的,--others是重要的部分,以便向您显示非缓存、非提交、通常被忽略的文件。

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

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

于 2009-01-21T21:17:24.157 回答
608

有一种更简单的方法(git 1.7.6+):

git status --ignored

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

于 2012-08-22T20:29:34.763 回答
409

另一个非常干净的选项(没有双关语。):

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.

注意:此解决方案不会显示已被删除的忽略文件。

于 2010-02-04T01:17:55.293 回答
41

虽然通常更正您的解决方案并不适用于所有情况。假设一个回购目录是这样的:

# 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

请注意doc列表中缺少的内容。您可以通过以下方式获得它:

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

注意附加--directory选项。

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

于 2009-09-18T20:14:04.557 回答
19

Git 现在内置了这个功能

git check-ignore *

当然,您可以将 glob 更改为**/*.dll您的情况

Git 参考

于 2014-10-27T01:52:22.397 回答
16

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

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

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

它还标识了特定的 gitignore 源代码行。

Git 继续跟踪与 gitignore 模式匹配的某些文件中的更改,这仅仅是因为这些文件已被添加。有用的是,上面的命令也显示了这些文件。

负 gitignore 模式也被匹配。但是,这些在列表中很容易区分,因为它们以 . 开头!

如果您使用的是 Windows,Git Bash包括 GNU find(如 所示find --version)。

如果列表很长(并且您有rev),您也可以通过扩展名(有点)显示它们:

$ 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(软件)正在迅速变化并且非常复杂。相比之下,GNU非常find稳定(至少,在这里使用的特性方面)。因此,任何希望通过展示他们对 Git 的深入了解来提高竞争力的人都会以不同的方式回答这个问题。

最好的答案是什么?这个答案故意尽量减少对 Git 知识的依赖,通过模块化(信息隔离)来达到稳定和简单的目标,并设计为持续很长时间

于 2015-08-28T15:24:06.420 回答
15

使用应该足够了

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

因为这涵盖了所涵盖的所有内容

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

因此后者是多余的。


您可以通过向~/.gitconfig文件添加别名来简化此操作:

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

现在您只需键入git ignored即可查看列表。更容易记住,打字更快。

如果您更喜欢 Jason Geng 解决方案的更简洁显示,您可以为它添加一个别名,如下所示:

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

然而,更详细的输出对于解决 .gitignore 文件的问题更有用,因为它列出了每个被忽略的棉花采摘文件。您通常会通过管道传输结果grep以查看您希望被忽略的文件是否在其中,或者您不想被忽略的文件是否在其中。

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

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

git status --ignored

-s通常可以不使用。)

于 2012-08-31T18:15:37.550 回答
3

如果您只需要一个有效的被忽略文件列表(无论它们如何被忽略),并且没有任何额外的通知和日志。

创建后,在任何地方(在 Git-bash 中)运行:

git ignore-list

通过执行创建它:

git config --global alias.ignore-list "! cd -- \"\${GIT_PREFIX:-.}\" && git ls-files -v \${1:-.} | sed -n -e \"s,^[a-z] \(.*\)$,\${GIT_PREFIX:-./}\1,p\" && git status --ignored --porcelain \${1:-.} 2>/dev/null | sed -n -e \"s/^\(\\!\\! \)\(.*\)$/\2/p\" #"

示例用法, 假设它是初始提交并且您想要推送所有内容,请尝试:

git ignore-list | xargs git add -f

笔记:

  1. macOS它已经过测试并且可以在两个Windows平台上运行!
  2. 进入cd目录后,仅列出从该目录(或其子目录)中忽略的文件。
  3. 最后,始终记录相对于 root-dir 的路径(其中包含.gitdir,无论您cd进入哪个目录)。

另一个有用的东西是人类可读性,比如如果整个目录被忽略,比如buildor node_modules,这将只记录 dir-name。
虽然git ls-files --others -i --exclude-standard命令记录每个文件(适用于xargs)。

于 2021-04-02T16:01:25.110 回答
1

我会做

git status --porcelain --ignored

并且只列出被忽略的文件

git status --porcelain --ignored | grep '^[!][!] '
于 2021-10-14T11:43:46.953 回答
0

(扩展其他答案)

请注意,git check-ignore使用已提交的.gitignore而不是工作树中的那个!要在不污染 git 历史记录的情况下使用它,您可以自由尝试编辑它,然后使用git commit --amend.

这个问题主要发生在您需要解决问题的方法时,即 git 不遵循目录。输入.gitignore

dirtokeep/**
!dirtokeep/.keep

.keep应该是dirtokeep.

结果将是所有内容都dirtokeep被忽略,除了 dirtokeep/.keep,这将导致dirtokeep目录也将在克隆/签出时构建。

于 2018-12-13T16:28:37.780 回答
0

如果您想通过手动删除这些文件来删除它们并让您的项目完全清除 GIT 之外的文件,您可以运行:

rm -rf $(git status --ignored)

警告:这将删除强制返回的git status --ignored。请自行决定使用,并且仅在您知道自己在做什么的情况下使用。

于 2021-04-15T10:06:37.717 回答
-1

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

在分支 master
你的分支是最新的'origin/master'。
未跟踪的文件:(
使用“git add ...”来包含将要提交的文件)

    node/logs/.gitignore 

.gitignore 是:

*

!.gitignore

于 2017-08-12T11:24:19.690 回答