我对Git感到厌烦,并遇到以下问题:
我的项目源树:
/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...
我在我的供应商分支中有代码(目前是MEF),我将在那里编译这些代码,然后将这些引用移到/src/refs中,这是项目获取它们的地方。
我的问题是,我的.gitignore设置为忽略*.dll和*.pdb。我可以执行gitadd-f bar.dll来强制添加被忽略的文件,这是正常的,问题是我无法找出存在哪些文件被忽略。
我想列出被忽略的文件,以确保我不会忘记添加它们。
我已经阅读了gitls文件的手册页,无法使其正常工作。在我看来,gitls文件——排除标准——我应该做我想做的事情。我错过了什么?
(扩展其他答案)
注意,git-check-ignore使用committed.gitignore,而不是工作树中的那个!为了在不影响git历史记录的情况下使用它,您可以自由地尝试编辑它,然后使用gitcommit提交--修改。
这个问题主要发生在您需要解决这个问题的方法时,即git不遵循目录。在.gitignore中输入:
dirtokeep/**
!dirtokeep/.keep
.keep应该是dirtokeep中的零长度文件。
其结果是,除了dirtokeep/.keep之外,dirtokeep中的所有内容都将被忽略,这将导致在clone/checkout时构造dirtokeep目录。
它应该足以使用
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通常可以省略。)
如果您只需要一个被忽略的文件的有效列表(无论它们如何被忽略),并且没有任何额外的通知和日志。
一旦创建,任何地方(在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)。