有没有办法明白了为什么有些文件是越来越被忽略的git(即,在一个规则.gitignore
文件,导致文件被忽略)?
想象一下,我有这个(或更复杂的情况下,与数以百计的文件夹和数以万计.gitignore
文件:
/
-.gitignore
-folder/
-.gitignore
-subfolder/
-.gitignore
-file.txt
如果我运行git add folder/subfolder/file.txt
混帐可能会抱怨它被忽略:
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
请参见手册页了解更多详情。
原来的答复如下:
混帐目前不提供这样的事。 但看到你的问题后,我做了一些谷歌搜索,发现于2009年,早在申请此功能,并部分实施 。 读线程之后,我意识到它不会太多的工作做正确,所以我就一个补丁开始工作,并希望能有它在接下来的一至两天完成。 当它准备好,我会更新这个答案。
更新:哇,这是比我预想的要困难得多。 的内脏git
的排除处理都相当神秘。 总之,这里是一个几乎完成了一系列提交其适用于今天的上游master
分支。 测试套件是完成了99%,但我还没有完成处理--stdin
选项呢。 希望我管理这个周末,然后提交我的补丁git的邮件列表。
在此期间,我会建议任何人谁是能够做到绝对欢迎测试-刚刚从克隆我的git
叉 ,检查出的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年第四季度) :
“ git check-ignore
”遵循相同的规则为“ git add
”和“ git status
在”忽略/排除机制没有考虑在已经跟踪路径的效果。
随着“ --no-index
”选项,它可以被用来诊断应该被忽略已被错误地添加到索引中哪些路径 。
见提交8231fa6从https://github.com/flashydave :
check-ignore
目前显示如何.gitignore
规则将治疗未跟踪路径。 跟踪的路径不产生有用的输出。
这防止了为什么一个路径变得意外跟踪除非该路径被首先从与索引移除调试git rm --cached <path>
。
选项--no-index
告诉命令绕过该路径在索引是检查,并因此允许将太检查跟踪路径。
虽然这种行为从特征偏离git add
和git status
及其使用情况下是不会对身体造成用户混淆。
测试脚本增强所要检查的标准忽略此选项,以确保正确的行为。
--no-index::
承接检查时,不要看在索引中。
这可以用于:
- 调试为什么一个路径变得例如通过跟踪
git add .
和用户预期是不按规则忽略或 - 发展模式,包括否定匹配先前添加的路径时
git add -f
。
我无法找到该名男子页任何东西,但这里有一个快速和肮脏的脚本,将检查你的文件中的每个父目录,看看它是否可以混帐add'ed。 在包含问题文件的目录中运行它:
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
为了增加使用的主要答案git check-ignore -v filename
(顺便说一句感谢)我发现我的.gitignore文件被封锁的一切,因为有一个通配符后换行,所以我必须:
* .sublime-project
举个例子。 我只是删除了换行,瞧! 它是固定的。