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

我得到我的脚湿与Git和有以下问题:

我的项目源代码树:

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

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

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

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

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

444190 次浏览

备注:


同样有趣的是(在qwertymk回答中提到),您也可以使用#0命令,至少在Unix上(在CMDwindows会话中为不起作用

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

第二个显示.gitignore的实际规则,它使文件在您的git存储库中被忽略。
在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]);

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

虽然通常正确的解决方案并不适用于所有情况。假设一个像这样的repo目录:

# 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 .gitignoredoctmp/*

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

# git ls-files --others --ignored --exclude-standardtmp/file1tmp/file2

请注意,清单中缺少doc。您可以使用:

# git ls-files --others --ignored --exclude-standard --directorydoc/

注意附加的--directory选项。

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

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

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.

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

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

git status --ignored

有没有办法告诉git-state忽略. 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 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通常可以省略。

Git现在内置了这个功能

git check-ignore *

当然,在你的情况下,你可以将全局更改为类似于**/*.dll的东西

Git引用

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

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

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

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

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

负gitignore模式也被匹配。然而,这些在清单中很容易区分,因为它们以!开头。

如果您使用的是Windows,gitbash包括GNUfind(如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知识的依赖,通过模块化(信息隔离)实现稳定性和简单性的目标,并且旨在持续长期时间。

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

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

    node/logs/.gitignore

. gitignore是:

*

!. gitignore

(延伸其他答案)

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

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

dirtokeep/**!dirtokeep/.keep

.keep应该是dirtokeep中的零长度文件。

结果将是dirtokeep中的一切将被忽略,除了dirtokeep/.keep,这将导致dirtokeep目录也将在克隆/签出时构建。

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

创建后,在任何地方(在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. 它经过测试,适用于macOSWindows平台!
  2. cd进入目录后,仅列出从该目录(或其子目录)中忽略的文件。
  3. 最后,始终记录相对于root-dir的路径(其中包含.git dir,无论您cd进入什么dir)。

另一个有用的东西是人性化的易读性,例如如果忽略整个目录,例如buildnode_modules,这将仅记录dir-name。
git ls-files --others -i --exclude-standard命令记录每个文件(适用于xargs)。

我只会做

git status --porcelain --ignored

并且只列出被忽略的文件

git status --porcelain --ignored | grep '^[!][!] '

您可以使用fd

要运行的命令是:

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

请注意,如果没有.git目录而只有.gitignore文件(例如。裸存储库),您必须特别说明. gitignore文件在哪里。

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

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

有关详细信息,请查看这里