.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/*/*