.gitignore排除文件夹,但包含特定的子文件夹

我有文件夹应用程序/我添加到.gitignore。 在应用程序/文件夹里面是文件夹应用程序/语言/ gr。 我怎样才能包含这个文件夹? 我已经试过了

application/ !application/language/gr/ 

没有运气…

如果你排除了application/ ,那么它下面的所有东西都将被排除(即使稍后的否定排除模式(“unignore”)可能会匹配application/中的某个东西)。

要做你想做的事情,你必须“统一”任何你想“统一”的父母目录。 通常你最终会为这种情况成对编写规则:忽略目录中的所有内容,而不是某个特定的子目录。

 # you can skip this first one if it is not already excluded by prior patterns !application/ application/* !application/language/ application/language/* !application/language/gr/ 

注意
尾随/ *是重要的:

  • 模式目录/排除一个名为dir的目录和(隐含)它下面的一切。
    使用dir /,Git将永远不会查看dir下的任何内容,因此决不会将任何“un-exclude”模式应用于dir下的任何内容。
  • 模式dir / *没有提到dir本身; 它只是排除在dir下的一切。 使用dir / *,Git会处理dir的直接内容,给其他模式一个“解除”一些内容(!dir / sub /)的机会。

从Karsten Blees(kblees)为Git 1.9 / 2.0(2014年第1季度) 提交59856de澄清案例:

gitignore.txt :阐明排除目录的recursion性质

一个可选的前缀“ ! ”否定模式; 任何先前模式排除的匹配文件将再次包含在内。

如果排除该文件的父目录,则不可能重新包含文件。 *
* :除非某些条件在git 2.8+中被满足,见下文)
由于性能的原因,Git没有列出排除的目录,所以包含文件的任何模式都不起作用,不pipe它们在哪里定义。

对于以“ ! ”开头的模式(例如“ \!important!.txt ”),请在第一个“ ! ”前加反斜杠(“ \ ”)。

示例排除除特定目录foo/bar以外的所有内容(请注意/* – 不带斜杠,通配符也会排除foo/bar内的所有内容):

  -------------------------------------------------------------- $ cat .gitignore # exclude everything except directory foo/bar /* !/foo /foo/* !/foo/bar -------------------------------------------------------------- 

2016年2月/ 3月更新:

请注意,使用git 2.9.x / 2.10(2016年中期?), 如果重新包含的path中没有通配符 ,则可能会重新包含文件,如果该文件的父目录被排除。

NguyễnTháiNgọcDuy( pclouds )试图添加此function:

  • 为git v2.7.0 提交506d8f1 ,在提交76b620d中恢复git v2.8.0-rc0
  • 提交5e57f9c git v2.8.0-rc0,…在提交5cee3493 git 2.8.0中还原(!)。

所以使用git 2.9+,这可能实际上工作,但最终还原:

 application/ !application/language/gr/ 

@Chris Johnsen的回答非常好,但是对于Git(1.8.2或更高版本)的更新版本,您可以使用双星号模式,以获得更多的速记解决scheme:

 # assuming the root folder you want to ignore is 'application' application/**/* # the subfolder(s) you want to track: !application/language/gr/ 

这样你就不必“pipe理”你要跟踪的子文件夹的父目录。

还有一些类似的问题,所以我会发表我之前写的:

我得到这个在我的机器上工作的唯一方法就是这样做:

 # Ignore all directories, and all sub-directories, and it's contents: */* #Now ignore all files in the current directory #(This fails to ignore files without a ".", for example #'file.txt' works, but #'file' doesn't): *.* #Only Include these specific directories and subdirectories: !wordpress/ !wordpress/*/ !wordpress/*/wp-content/ !wordpress/*/wp-content/themes/ !wordpress/*/wp-content/themes/* !wordpress/*/wp-content/themes/*/* !wordpress/*/wp-content/themes/*/*/* !wordpress/*/wp-content/themes/*/*/*/* !wordpress/*/wp-content/themes/*/*/*/*/* 

请注意,您必须明确允许您要包含的每个级别的内容。 因此,如果我在主题下有深层次的子目录5,我仍然需要把它拼出来。

这是@ Yarin在这里的评论: https : //stackoverflow.com/a/5250314/1696153

这些是有用的话题:

  • .gitignore中的否定模式如何工作?
  • gitignore排除规则如何实际工作?

我也试过了

 * */* **/** 

**/wp-content/themes/**

/wp-content/themes/**/*

没有任何一个对我有用, 很多线索和错误!

所以,因为很多程序员使用节点。 满足这个问题的用例是排除除一个模块module-a之外的node_modules例如:

 !node_modules/ node_modules/* !node_modules/module-a/ 

只是沿着目录结构来获得你想要的东西的另一个例子。 注意:我没有排除Library/ but Library/**/*

 # .gitignore file Library/**/* !Library/Application Support/ !Library/Application Support/Sublime Text 3/ !Library/Application Support/Sublime Text 3/Packages/ !Library/Application Support/Sublime Text 3/Packages/User/ !Library/Application Support/Sublime Text 3/Packages/User/*macro !Library/Application Support/Sublime Text 3/Packages/User/*snippet !Library/Application Support/Sublime Text 3/Packages/User/*settings !Library/Application Support/Sublime Text 3/Packages/User/*keymap !Library/Application Support/Sublime Text 3/Packages/User/*theme !Library/Application Support/Sublime Text 3/Packages/User/**/ !Library/Application Support/Sublime Text 3/Packages/User/**/*macro !Library/Application Support/Sublime Text 3/Packages/User/**/*snippet !Library/Application Support/Sublime Text 3/Packages/User/**/*settings !Library/Application Support/Sublime Text 3/Packages/User/**/*keymap !Library/Application Support/Sublime Text 3/Packages/User/**/*theme 

> git add Library

> git status

 On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: Library/Application Support/Sublime Text 3/Packages/User/Default (OSX).sublime-keymap new file: Library/Application Support/Sublime Text 3/Packages/User/ElixirSublime.sublime-settings new file: Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings new file: Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings new file: Library/Application Support/Sublime Text 3/Packages/User/RESTer.sublime-settings new file: Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter/Monokai (SL).tmTheme new file: Library/Application Support/Sublime Text 3/Packages/User/TextPastryHistory.sublime-settings new file: Library/Application Support/Sublime Text 3/Packages/User/ZenTabs.sublime-settings new file: Library/Application Support/Sublime Text 3/Packages/User/adrian-comment.sublime-macro new file: Library/Application Support/Sublime Text 3/Packages/User/json-pretty-generate.sublime-snippet new file: Library/Application Support/Sublime Text 3/Packages/User/raise-exception.sublime-snippet new file: Library/Application Support/Sublime Text 3/Packages/User/trailing_spaces.sublime-settings 

我发现只有这个实际的作品。

 **/node_modules/* !**/node_modules/keep-dir 

特别是对于旧的Git版本,大部分build议不会很好地工作。 如果是这样的话,我会把一个单独的.gitignore放在我希望包含内容的目录中,而不pipe其他设置如何,并允许在那里需要什么。

例如:/.gitignore

 # ignore all .dll files *.dll 

/dependency_files/.gitignore

 # include everything !* 

所以/ dependency_files(甚至.dll文件)中的所有内容都包含在内。

我在这里find了一个类似的例子,默认情况下, .gitignore忽略所有使用asterix,然后覆盖公共目录。

 * !public !.gitignore 

如果遇到OP场景,这是不够的。

如果你想提交一个特定的public子文件夹,例如在你的public/products目录中,你想包括一个子文件夹深的文件,例如包括public/products/a/b.jpg他们将不会被正确检测,即使你可以像这样添加它们!/public/products!public/products/*等等。

解决方法是确保为每个path级别添加一个条目来覆盖它们。

 * !.gitignore !public/ !public/*/ !public/products/ !public/products/* !public/products/*/ !public/products/*/ !public/products/*/*