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

时间:2009-01-21 20:09:36

标签: git ignore

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

我的项目源代码树:

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

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

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

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

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

10 个答案:

答案 0 :(得分:543)

注意:


同样有趣(在qwertymkanswer中提及),您也可以使用git check-ignore -v命令,至少在Unix上(不起作用在CMD Windows 会话中)

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

第二个显示.gitignore的实际规则,该规则使您的git仓库中的文件被忽略。
在Unix上,使用“What expands to all files in current directory recursively?”和bash4 +:

git check-ignore **/*

(或find -exec命令)


原始答案42009)

git ls-files -i

应该有效,但its source code表示:

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'文件(称为'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 --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 man page中所述,--others是重要的部分,为了向您展示非缓存,未提交,通常被忽略的文件。

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

  

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

答案 1 :(得分:386)

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

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.

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

答案 2 :(得分:384)

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

git status --ignored

请参阅Is there a way to tell git-status to ignore the effects of .gitignore files?

答案 3 :(得分:38)

虽然通常正确,但您的解决方案并不适用于所有情况。 假设一个像这样的回购公司:

# 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根本没有出现。

答案 4 :(得分:17)

Git现在已经内置了这个功能

git check-ignore *

当然你可以在你的情况下将glob更改为**/*.dll

Git Reference

答案 5 :(得分:12)

使用

就足够了
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。)

答案 6 :(得分:9)

以下是如何在工作树中打印完整的文件列表,这些文件与位于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知识的依赖,通过模块化(信息隔离)实现稳定性和简单性的目标,并且旨在持续时间。

答案 7 :(得分:1)

(扩展其他答案)

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

主要在您需要解决该问题的情况下才发生此问题,即git不遵循目录。输入.gitignore

dirtokeep/**
!dirtokeep/.keep

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

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

答案 8 :(得分:1)

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

一旦创建,在任何地方(在 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:-.} | sed -n -e \"s/^\(\\!\\! \)\(.*\)$/\2/p\" #"
<块引用>

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

git ignore-list | xargs git add -f

注意事项:

  1. 它已经过测试,适用于 macOSWindows 平台!
  2. 一旦您 cd 进入一个目录,只列出该目录(或其子目录)中忽略的文件。
  3. 最后,始终记录相对于 root-dir 的路径(其中包含 .git 目录,无论您 cd 进入哪个目录)。

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

答案 9 :(得分:0)

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

rm -rf $(git status --ignored)

警告:这将强制删除git status --ignored返回的任何文件和目录。仅在您知道自己在做什么的情况下自行决定使用。