我对Git感到厌烦,并遇到以下问题:

我的项目源树:

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

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

我的问题是,我的.gitignore设置为忽略*.dll和*.pdb。我可以执行gitadd-f bar.dll来强制添加被忽略的文件,这是正常的,问题是我无法找出存在哪些文件被忽略。

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

我已经阅读了gitls文件的手册页,无法使其正常工作。在我看来,gitls文件——排除标准——我应该做我想做的事情。我错过了什么?


当前回答

笔记:

小白的答案更简单(git1.7.6+):gitstatus--忽略(如“有没有方法告诉gitstatus忽略.gitignore文件的影响?”)MattDiPasquale的答案(有待投票)gitclean-ndX适用于较旧的git,显示了可以删除哪些被忽略的文件的预览(无需删除任何内容)


同样有趣的是(在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/RafiB.在评论中建议避免(危险的)全球明星:

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]);

例外?

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

Try:

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

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-file-i--exclusive from…(不包含-o)包含缓存文件。)

正如ls文件手册页中提到的,其他文件是重要的部分,以便向您展示未缓存、未提交、通常被忽略的文件。

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

排除标准在每个目录中添加标准的git排除:.git/info/exclude、.gitignore和用户的全局排除文件。

其他回答

它应该足以使用

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耿的解决方案的简洁显示,可以添加别名,如下所示:

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

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

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

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

git status --ignored

(-s通常可以省略。)

Git现在内置了这个功能

git check-ignore *

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

Git参考

笔记:

小白的答案更简单(git1.7.6+):gitstatus--忽略(如“有没有方法告诉gitstatus忽略.gitignore文件的影响?”)MattDiPasquale的答案(有待投票)gitclean-ndX适用于较旧的git,显示了可以删除哪些被忽略的文件的预览(无需删除任何内容)


同样有趣的是(在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/RafiB.在评论中建议避免(危险的)全球明星:

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]);

例外?

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

Try:

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

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-file-i--exclusive from…(不包含-o)包含缓存文件。)

正如ls文件手册页中提到的,其他文件是重要的部分,以便向您展示未缓存、未提交、通常被忽略的文件。

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

排除标准在每个目录中添加标准的git排除:.git/info/exclude、.gitignore和用户的全局排除文件。

以下是如何在工作树中打印与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,GitBash包含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 find、man git check ignore、man rev和man sort。

整个方法的要点是Git(软件)正在快速变化,而且非常复杂。相比之下,GNU的发现是极其稳定的(至少在这里使用的特性方面)。因此,任何希望通过展示自己对Git的深入了解来提高竞争力的人都会以不同的方式回答这个问题。

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

你可以使用fd。

要运行的命令是:

comm -23 <(fd -HI | sort) <(fd -H | sort) 

请注意,如果没有.git目录而只有.gitignore文件(例如裸机),则必须明确指出.gitignorefile文件的位置。

comm -23 <(fd -HI | sort) <(fd -H --ignore-file .gitignore | sort)

更具体地说,使用--no ignore vcs而不是-I

有关详细信息,请查看此处。