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

时间:2011-04-03 22:48:48

标签: git gitignore

我有文件夹application /我添加到.gitignore。应用程序/文件夹内是文件夹application / language / gr。我该如何包含此文件夹? 我试过这个

application/
!application/language/gr/

没有运气......

16 个答案:

答案 0 :(得分:1315)

如果您排除application/,那么其下的所有内容将始终被排除(即使某些后来的否定排除模式(“unignore”)可能与application/下的内容匹配)。

要做你想做的事,你必须“取消”你想要“unignore”的任何东西的父目录。通常你最终会成对编写这种情况的规则:忽略目录中的所有内容,但不是某些某个子目录。

# 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/)。

答案 1 :(得分:117)

来自Commit 59856de的Git 1.9 / 2。0(2014年第一季度)的

Karsten Blees (kblees)澄清了这个案例:

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年中期?),如果排除该文件的父目录if there is no wildcard in the path re-included,则可能会重新包含文件。

Nguyễn Thái Ngọc Duy (pclouds)正在尝试添加此功能:

因此,使用git 2.9+,这可能实际上有效,但最终还原了:

application/
!application/language/gr/

答案 2 :(得分:44)

@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/

这样您就不必“unignore”您要跟踪的子文件夹的父目录。


使用Git 2.17.0(不确定在此版本之前的早期版本。可能回到1.8.2),使用**模式结合排除每个子目录导致文件工作。例如:

# 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

答案 3 :(得分:8)

我发现只有实际有效。

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

答案 4 :(得分:4)

因此,由于许多程序员使用节点。遇到此问题的用例是排除node_modules除了一个模块module-a,例如:

!node_modules/

node_modules/*
!node_modules/module-a/

答案 5 :(得分:3)

另一个走下目录结构以获得您想要的内容的示例。注意:我没有排除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

答案 6 :(得分:3)

特别是对于较旧的Git版本,大多数建议都不会很好。 如果是这种情况,我会在我希望包含内容的目录中放置一个单独的.gitignore,而不管其他设置如何,并允许在那里需要。

例如: /.gitignore

# ignore all .dll files
*.dll

/dependency_files/.gitignore

# include everything
!*

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

答案 7 :(得分:3)

我在这里找到了类似的情况,默认情况下,在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/*/*

答案 8 :(得分:2)

在WordPress中,这对我有所帮助:

wp-admin/
wp-includes/
/wp-content/*
!wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/plugin-name/
!/wp-content/plugins/plugin-name/*.*
!/wp-content/plugins/plugin-name/**

答案 9 :(得分:2)

我经常在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 Quotes)。

以下是我在仓库here中使用的.include文件的示例。

/home/abhirup/token.txt
/home/abhirup/.include
/home/abhirup/.vim/*
/home/abhirup/.viminfo
/home/abhirup/.bashrc
/home/abhirup/.vimrc
/home/abhirup/.condarc

答案 10 :(得分:2)

添加其他答案:

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

结果如下:

enter image description here

答案 11 :(得分:2)

gitignore-指定要忽略的故意未跟踪的文件。

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

class CustomWKWebViewController: UIViewController {

private func settingWebView() -> WKWebView {
    let userScript = WKUserScript(source: source, injectionTime: .atDocumentStart, forMainFrameOnly: true)

    let userContentController = WKUserContentController()
    userContentController.add(self, name: "Login")  
    userContentController.add(self, name: "Other")
    userContentController.add(self, name: “LD”)
    userContentController.addUserScript(userScript)                     

    let config = WKWebViewConfiguration()                   
    config.userContentController = userContentController

    webView = WKWebView(frame: .zero, configuration: config)
    webView!.navigationDelegate = self
    webView!.uiDelegate = self
    webView!.scrollView.bounces = false
    webView!.allowsBackForwardNavigationGestures = true
    webView!.backgroundColor = .clear
    webView!.scrollView.backgroundColor = .clear

    if let request = getRequest() {
        webView!.load(request)
    }
    return webView!
}

func reloadWebView(url: URL?) {

    if let url = url, let webView = self.webView {
        var requestForBlank = URLRequest(url: URL(string: "about:blank")!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 3)
        requestForBlank.httpMethod = "POST"

        var request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 3)
        request.httpMethod = "POST"

        webView.load(requestForBlank)
        webView.load(request)//breakpoint always break here, but the view don't load request.
    }
}

}

WordPress 的另一个示例:

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

更多信息,请点击此处:https://git-scm.com/docs/gitignore

答案 12 :(得分:2)

最简单也是最好的方法是尝试手动添加文件(通常优先于.gitignore样式的规则):

git add /path/to/module

您甚至可能希望添加-N 意图标志,建议您添加它们,但不是立即添加。我经常对尚不准备上演的新文件执行此操作。


这是copy of an answer上关于轻松进行重复质量检查的文章。我将其重新发布在此处以提高可见性-我发现不用一堆gitignore规则会更容易。

答案 13 :(得分:0)

我想跟踪jquery生产js文件,这很有效:

node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*

答案 14 :(得分:0)

我的JetBrains IntelliJ IDEA .gitignore配置,其中我需要排除.idea以外的.idea/runConfigurations文件夹:

.idea
!.idea/
.idea/*
!.idea/runConfigurations/

请参阅:https://github.com/daggerok/gitignore-idea-runConfigurations

答案 15 :(得分:0)

这对我有用:

xdotool key Arabic_0