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

我的项目源树:

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

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

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

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

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


当前回答

有一种更简单的方法(git1.7.6+):

git status --ignored

请参阅有没有方法告诉gitstatus忽略.gitignore文件的影响?

其他回答

有一种更简单的方法(git1.7.6+):

git status --ignored

请参阅有没有方法告诉gitstatus忽略.gitignore文件的影响?

我会的

git status --porcelain --ignored

并且只列出忽略的文件

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

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

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.

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

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

一旦创建,任何地方(在Gitbash中)都可以运行:

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忽略列表|xargs git add-f

笔记:

它已经过测试,可以在macOS和Windows平台上运行!当您cd到目录中时,只列出从该目录(或其子目录)忽略的文件。最后,始终记录相对于根目录的路径(其中包含.git目录,无论您插入哪个目录)。

另一个有用的东西是人类可读性,比如如果忽略了整个目录,比如build或node_modules,这将只记录目录名。而gitls文件--others-i--排除每个文件的标准命令日志(适用于xargs)。

你可以使用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

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