Answers:
如果您排除application/
,则其下的所有内容将始终被排除(即使后来出现的某些否定排除模式(“忽略”)可能与下方的内容匹配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
并且(暗含)目录下的所有目录。dir/
Git时,它将永远不会查看下面的任何内容dir
,因此也不会将任何“不排除”模式应用于下面的任何内容dir
。dir/*
没有说明什么dir
;它只是排除了所有内容dir
。使用dir/*
,Git将处理的直接内容dir
,从而为其他模式提供“取消排除”部分内容(!dir/sub/
)的机会。/*
很重要。如果目录被排除,Git将永远不会查看该目录的内容。该模式dir/
不包括名为目录的目录,dir
并且(暗含)目录下的所有目录。模式本身并dir/*
没有说明什么dir
;它只是排除了所有内容dir
。使用dir/
Git时,它将永远不会查看下面的任何内容dir
,因此也不会将任何“不排除”模式应用于下面的任何内容dir
。使用dir/*
,Git将处理的直接内容dir
,从而为其他模式提供“取消排除”部分内容(!dir/sub/
)的机会。
git add -f .
git status
,它只会告诉您将要添加顶级目录。相反,请执行git add
顶层目录中的a,然后git status
(希望)列出已被模式匹配的文件的子集。
来自Karsten Blees(kblees)的Git 1.9 / 2.0 提交59856de(2014年第1季度)澄清了以下情况:
gitignore.txt
:阐明排除目录的递归性质可选前缀“
!
”,用于否定模式;先前模式排除的所有匹配文件将再次包含在内。如果排除该文件的父目录,则无法重新包含该文件。(
*
)
(*
:除非git 2.8+中满足某些条件,否则请参见下文)
Git出于性能原因不会列出排除的目录,因此所包含文件上的任何模式均无效,无论它们在何处定义。对于以文字“ ” 开头的模式(例如“
\
”),请在第一个“!
” 前面加上反斜杠(“ ”)。!
\!important!.txt
排除特定目录以外的所有内容的示例
foo/bar
(请注意/*
-,不带斜杠,通配符还将排除内的所有内容foo/bar
):
--------------------------------------------------------------
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
--------------------------------------------------------------
在您的情况下:
application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**
您必须先将文件夹列入白名单,然后才能将给定文件夹中的文件列入白名单。
2016年2月/ 3月更新:
请注意,在git 2.9.x / 2.10(2016年中?)下,如果重新包含的路径中没有通配符,则如果排除了该文件的父目录,则可以重新包含该文件。
NguyễnTháiNgọcDuy(pclouds
)试图添加此功能:
因此,使用git 2.9+可能确实有效,但最终被还原:
application/
!application/language/gr/
v2.8.1.windows.1
但它似乎不起作用:(
application/
+ !application/language/gr/
模式已按预期工作。
@Chris Johnsen的答案很好,但是对于较新版本的Git(1.8.2或更高版本),您可以利用双星号模式来获得更多速记解决方案:
# assuming the root folder you want to ignore is 'application'
application/**/*
# the subfolder(s) you want to track:
!application/language/gr/
这样,您不必“忽略”要跟踪的子文件夹的父目录。
在Git 2.17.0(不确定此版本的发布时间。可能回到1.8.2之前)中,**
对于导致文件生成的每个子目录,请使用与excludes结合使用的模式。例如:
# assuming the root folder you want to ignore is 'application'
application/**
# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder
**
可以匹配零个子文件夹,并且*
可以匹配language
和排除它,从而防止包含gr
。完整的父母@Chris Johnson建议似乎仍然有必要。
/www/**/* !/www/config.xml !/www/res
config.xml和res目录仍然被忽略。
!/www/res/
。您可以使用该folder/**/*
模式,但是仍然需要为要添加的每个子目录添加排除项。它比忽略/排除组合更短,更易读。
关于此还有很多类似的问题,因此我将发布我之前写的内容:
我在计算机上使用此方法的唯一方法是这样做:
# 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
这些是有用的主题:
我也试过
*
*/*
**/**
和 **/wp-content/themes/**
要么 /wp-content/themes/**/*
这些都不对我有用。大量的反复试验!
!
规则放在底部。
我发现只有这实际上工作。
**/node_modules/*
!**/node_modules/keep-dir
最简单也是最好的方法是尝试手动添加文件(通常优先于.gitignore
样式规则):
git add /path/to/module
您甚至可能希望-N
添加意图,以建议您将其添加,但不是立即添加。我经常为尚不准备上演的新文件执行此操作。
这是一份很容易重复的质量检查的答案副本。我将其重新发布在此处以提高可见性-我发现不使用混乱的gitignore规则会更容易。
添加其他答案:
!/.vs/ <== include this folder to source control, folder only, nothing else
/.vs/* <== but ignore all files and sub-folder inside this folder
!/.vs/ProjectSettings.json <== but include this file to source control
!/.vs/config/ <== then include this folder to source control, folder only, nothing else
!/.vs/config/* <== then include all files inside the folder
结果如下:
我在这里发现了类似的情况,默认情况下,在laravel中,.gitignore
所有使用asterix的都将忽略,然后覆盖公共目录。
*
!public
!.gitignore
如果遇到OP场景,这还不够。
如果您要提交的特定子文件夹public
,譬如说例如,在你的public/products
目录要包括那些一个子文件夹深如文件,包括public/products/a/b.jpg
他们不会正确检测,即使你加他们特别喜欢这个!/public/products
,!public/products/*
等。
解决方案是确保为每个这样的路径级别添加一个条目,以覆盖所有条目。
*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*
只是走下目录结构以获取所需内容的另一个示例。注意:我并未排除,Library/
但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
gitignore-指定要忽略的故意未跟踪的文件。
排除特定目录foo / bar以外的所有内容的示例(请注意/ * -不带斜杠,通配符还将排除foo / bar内的所有内容):
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
WordPress的另一个示例:
!/wp-content
wp-content/*
!/wp-content/plugins
wp-content/plugins/*
!wp-content/plugins/my-awesome-plugin
此处提供更多信息:https : //git-scm.com/docs/gitignore
我经常在CLI中使用此变通办法,而不是配置我.gitignore
,而是创建一个单独的.include
文件,在该文件中定义我希望包含的(子)目录,尽管这些目录直接或递归地被忽略.gitignore
。
因此,我另外使用
git add `cat .include`
在暂存期间,在提交之前。
对于OP,我建议使用.include
包含以下几行的:
<parent_folder_path>/application/language/gr/*
注意:使用cat
不允许使用别名(在内.include
)来指定$ HOME(或任何其他特定目录)。这是因为homedir/app1/*
当git add
使用上述命令传递给该行时,该行显示为git add 'homedir/app1/*'
,并且将字符括在单引号('')中会保留引号内每个字符的文字值,从而防止别名(例如homedir)起作用(请参阅Bash Single)。引号)。
这是.include
我在此处的回购中使用的文件的示例。
/home/abhirup/token.txt
/home/abhirup/.include
/home/abhirup/.vim/*
/home/abhirup/.viminfo
/home/abhirup/.bashrc
/home/abhirup/.vimrc
/home/abhirup/.condarc
我的JetBrains IntelliJ IDEA .gitignore配置,在这里我需要排除wholde .idea
文件夹,除了.idea/runConfigurations
:
.idea
!.idea/
.idea/*
!.idea/runConfigurations/
参见:https : //github.com/daggerok/gitignore-idea-runConfigurations
.gitignore
模式格式”文档更加清晰(2013年12月)。请参阅下面的答案