I was trying to whitelist a single file pattern in a directory that I was otherwise content to ignore, but when I tried: /m4/ !/m4/virt-*.m4 then 'git add' kept warning me that I had to use -f. I finally figured out that ignoring a directory is much different than ignoring all files in a directory, when it comes to later negation patterns: /m4/* !/m4/virt-*.m4 Improving the documentation will help others learn from my mistake. CC: Jonathan Nieder <jrnieder@xxxxxxxxx> CC: Johannes Sixt <j6t@xxxxxxxx> Signed-off-by: Eric Blake <eblake@xxxxxxxxxx> --- v3: split out fnmatch tweaks, don't tweak specification of patterns or existing examples but instead add an entirely new example, make the example use a deeper hierarchy Documentation/gitignore.txt | 38 ++++++++++++++++++++++++++++++++++++++ 1 files changed, 38 insertions(+), 0 deletions(-) diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt index 9b1e5e1..e1ad234 100644 --- a/Documentation/gitignore.txt +++ b/Documentation/gitignore.txt @@ -139,6 +139,44 @@ EXAMPLES [...] -------------------------------------------------------------- +It is possible to ignore most of a hierarchy, while still +white-listing a single file, by ignoring multiple files then using a +negation pattern for the file in question. However, this requires +ignoring files and not directories, since no patterns are ever matched +inside of an ignored directory. For nested files, it requires several +iterations of refined patterns. + +-------------------------------------------------------------- + $ git status + [...] + # Untracked files: + [...] + # Documentation/build/file + # build/file + # build/foo/baz + # build/foo/other + [...] + $ cat .gitignore + # Use anchoring, since `build' would ignore Documentation/build. + # Do not ignore the directory itself, ... + # /build/ + # rather ignore files in the top-level build directory, ... + /build/* + # but permit child directories, ... + !/build/*/ + # then ignore all nested files, ... + /build/*/* + # and finally white-list the special file + !/build/foo/baz + $ git status + [...] + # Untracked files: + [...] + # Documentation/build/file + # build/foo/baz + [...] +-------------------------------------------------------------- + Another example: -------------------------------------------------------------- -- 1.7.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html