我对Git感到厌烦,并遇到以下问题:
我的项目源树:
/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...
我在我的供应商分支中有代码(目前是MEF),我将在那里编译这些代码,然后将这些引用移到/src/refs中,这是项目获取它们的地方。
我的问题是,我的.gitignore设置为忽略*.dll和*.pdb。我可以执行gitadd-f bar.dll来强制添加被忽略的文件,这是正常的,问题是我无法找出存在哪些文件被忽略。
我想列出被忽略的文件,以确保我不会忘记添加它们。
我已经阅读了gitls文件的手册页,无法使其正常工作。在我看来,gitls文件——排除标准——我应该做我想做的事情。我错过了什么?
以下是如何在工作树中打印与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知识的依赖,通过模块化(信息隔离)实现稳定和简单的目标,并设计为持续很长时间。
虽然通常正确,但解决方案并非在所有情况下都有效。假设回购目录如下:
# 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根本不出现。
它应该足以使用
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通常可以省略。)