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
,.gitignore
和user'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 find
, man git-check-ignore
, man rev
和man sort
。
假设有几个忽略目录,为什么不使用“git status node / logs /”来告诉你哪些文件将被添加? 在目录中我有一个文本文件,不是状态输出的一部分,例如:
在分支主人
你的分支是最新的“起源/主”。
未logging的文件:
(使用“git add …”来包含将要提交的内容)
node/logs/.gitignore
.gitignore是:
*
!的.gitignore