哪个gitignore规则忽略了我的文件?

有什么办法看到为什么有些文件被git忽略(即.gitignore文件中的哪个规则导致文件被忽略)?

想象一下,我有这个(或者更复杂的场景,有数百个文件夹和数十个.gitignore文件:

/
-.gitignore
-folder/
    -.gitignore
    -subfolder/
              -.gitignore
              -file.txt

如果我运行git add folder/subfolder/file.txt git可能会抱怨它被忽略:

The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.

有什么办法可以知道哪个.gitignore有一条规则可以忽略这个文件,并且还显示规则? 喜欢:

The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.

要不就:

$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt

git check-ignore -v filename

有关更多详细信息,请参阅手册页。

原始答案如下:

git目前不提供这样的东西。 但看到你的问题后,我做了一些Google搜索,发现在2009年这个功能被要求和部分实施。 在阅读完主题后,我意识到做好这件事并不是太多工作,所以我已经开始了一个补丁的工作,并希望在接下来的一两天内完成。 准备就绪时,我会更新这个答案。

更新:哇,这比我想象的要困难得多。 git的排除处理的内部是相当隐秘的。 无论如何,这是几乎完成的一系列提交,适用于今天的上游master分支。 测试套件已完成99%,但我还没有完成对--stdin选项的处理。 希望这个周末我能够管理好,然后将我的补丁提交给git邮件列表。

与此同时,我绝对欢迎来自任何能够这样做的人进行测试 - 只需从我的git fork克隆,检查check-ignore分支,然后像平常一样编译它。

更新2:完成了! 最新版本在上面的github上,我已经将补丁系列提交到git邮件列表以供同行评审。 让我们看看他们的想法...

更新3:经过几个月的黑客/补丁评论/讨论/等待,我很高兴能够说这个功能现在已经到达git的master分支,并且将在下一个版本(1.8.2,预期2013年3月8日)。 这是check-ignore手册页。 唷,那是比我预期的更多的工作!

更新4:如果你对这个答案的发展和功能的完整故事感兴趣,请查看GitMinutes播客的第32集。


更新git 2.8(2016年3月):

GIT_TRACE_EXCLUDE=1 git status

请参阅“验证.gitignore文件的方法”

这与下面描述的git check-ignore -v是互补的。


原始答案:2013年9月(git 1.8.2,然后1.8.5+):

git check-ignore在git 1.8.5 / 1.9(2013年第4季度)中再次提高:

git check-ignore ”遵循与“ git add ”和“ git status ”相同的规则,因为忽略/排除机制不会对已经跟踪的路径生效。
使用“ --no-index ”选项,可以用它来诊断应该忽略哪些路径被错误地添加到索引中

请参阅https://github.com/flashydave中的提交8231fa6:

check-ignore当前显示.gitignore规则如何处理未跟踪的路径。 跟踪的路径不会生成有用的输出。
这可以防止为什么意外跟踪路径的调试,除非首先使用git rm --cached <path>从索引中删除该git rm --cached <path>

选项--no-index指示命令绕过对索引中路径的检查,因此也允许检查跟踪的路径。

虽然这种行为偏离了git addgit status的特性,但它的用例不太可能导致任何用户混淆。

测试脚本被加强以根据标准忽略来检查该选项以确保正确的行为。


--no-index::

进行检查时不要查看索引。
这可以用于:

  • 调试为什么通过例如git add .追踪路径git add . 并没有被用户预期的规则忽略或
  • 当开发包括否定的模式以匹配之前添加了git add -f的路径时。

  • 我在man page中找不到任何东西,但是这里有一个快速且肮脏的脚本,它将检查每个父目录中的文件,看看它是否可以被添加git。 在包含问题文件的目录中运行它为:

    test-add.sh STOP_DIR FILENAME
    

    其中STOP_DIR是Git项目的顶级目录, FILENAME是问题文件名(没有路径)。 它会在层次结构的每个级别创建一个同名的空文件(如果它不存在)并尝试使用git add -n来查看它是否可以添加(它会自行清理)。 它输出如下内容:

    FAILED:    /dir/1/2/3
    SUCCEEDED: /dir/1/2
    

    剧本:

    #!/usr/bin/env bash
    TOP=$1
    FILE=$2
    DIR=`pwd`
    while : ; do
      TMPFILE=1
      F=$DIR/$FILE
      if [ ! -f $F ]; then
        touch $F
        TMPFILE=0
      fi
      git add -n $F >/dev/null 2>&1
      if [ $? = 0 ]; then
        echo "SUCCEEDED: $DIR"
      else
        echo "FAILED:    $DIR"
      fi
      if [ $TMPFILE = 0 ]; then
        rm $F
      fi
      DIR=${DIR%/*}
      if [ "$DIR" < "$TOP" ]; then
        break
      fi
    done 
    
    链接地址: http://www.djcxy.com/p/45163.html

    上一篇: Which gitignore rule is ignoring my file?

    下一篇: How to .gitignore all files/folder in a folder, but not the folder itself?