【问题标题】:gitignore: Ignore all files in folder hierarchy except one specific filetypegitignore:忽略文件夹层次结构中的所有文件,除了一种特定的文件类型
【发布时间】:2011-12-09 20:40:22
【问题描述】:

我想忽略文件夹下面和文件夹中的所有文件,但可能位于文件夹层次结构中某处的特定文件类型除外:

例子

/Test
/Test/unknown/folder/structure/below

现在我想忽略 Test 文件夹中和下面的所有文件,除了名为 layout.css 的某个 css 文件,例如:

/Test/layout.css
/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/layout.css
/Test/in/a/unknown/folder/ignore.me

.gitignore 应该忽略

/Test/fileto.ignore
/Test/another/folder/ig.nore
/Test/in/a/unknown/folder/ignore.me

我的 .gitignore 文件不起作用:

Test/
!layout.css

有什么建议吗?

【问题讨论】:

  • 你也试过其他顺序吗?
  • @Jan 是的,我做到了 - 不幸的是没有成功
  • 请参阅:stackoverflow.com/a/17821597 以了解集中式解决方案。

标签: git gitignore


【解决方案1】:

通过将.gitignore 文件放入Test/ 目录中,我能够让您的示例工作,其中包含以下内容。

*
!*/
!.gitignore
!layout.css

【讨论】:

  • 大卫,感谢您的回答。由于我有很多 Test 文件夹散布在各处,因此我更喜欢“集中式”解决方案,而不是到处都有各种 .gitignore 文件。
  • @Jörg 不幸的是,我无法找到一种方法来做到这一点。您可能已尝试通过将Test 附加到前两行(并删除第三行)来调整我的解决方案并在顶级目录中使用它。如果你这样做了,你会发现这并不能解决问题。希望有人知道如何提供更完整的解决方案。
  • 是的,我尝试了各种组合和您的解决方案的一些变体,但正如您所说,它不起作用。无论如何,感谢您抽出宝贵时间。
【解决方案2】:

为了完成您想要的,您需要使用一些否定排除。

基本思想是您需要排除您希望不被忽略的任何文件的每个父目录。

因此,如果您希望将 /Test/in/a/unknown/folder/layout.css 添加到您的 git 存储库中,那么您必须取消忽略 /Test/、/Test/in/、/Test/ in/a/、/Test/in/a/unknown/ 和 /Test/in/a/unknown/folder/。

然后,当您最终到达包含一些被忽略和一些未忽略文件的目录时,您需要单独指定每个文件,如下所示:

# Fille: .gitignore
!Test/
Test/*
!Test/layout.css
Test/fileto.ignore
!Test/another/
Test/another/*
!Test/another/folder/
Test/another/folder/*
!Test/in/
Test/in/*
!Test/in/a/
Test/in/a/*
!Test/in/a/unknown/
Test/in/a/unknown/*
!Test/in/a/unknown/folder/
Test/in/a/unknown/folder/ignore.me
!Test/in/a/unknown/folder/layout.css

所以当你运行$ git add-all 时,你会看到你想要的结果:

$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   .gitignore
    new file:   Test/in/a/unknown/folder/layout.css
    new file:   Test/layout.css

注意:您可以在 http://lexsheehan.blogspot.com/2014/05/git-add-update.html 找到关于为什么 git add-all 是向 git 存储库添加文件的最佳方式的解释

【讨论】:

    【解决方案3】:

    相当老的问题,但由于我现在也在努力解决这个问题,所以我想我会分享这个问题的实际解决方案。

    问题是,虽然您不能在 Git 中提交空目录,就好像它们被忽略一样,但这条规则不适用于 .gitignore

    来自https://git-scm.com/docs/gitignore

    结尾的“/**”匹配里面的所有内容。例如,“abc/**” 匹配目录“abc”中的所有文件,相对于 .gitignore 文件,具有无限深度。

    斜杠后跟两个连续的星号,然后是斜杠匹配 零个或多个目录。例如,“a/**/b”匹配“a/b”, “a/x/b”、“a/x/y/b”等等。

    ** 匹配内部的所有内容 - 字面意思是所有内容 - 文件和目录。

    这将我们引向 gitignore 文档中的另一点:

    可选前缀“!”这否定了模式;任何匹配的文件 被先前模式排除的将再次被包含。 这不是 如果该文件的父目录是,则可以重新包含该文件 排除。 Git 不会列出排除的目录以提高性能 原因,所以包含的文件上的任何模式都没有影响,不管 它们被定义的地方。在第一个前面放一个反斜杠(“\”) “!”对于以文字“!”开头的模式,例如, “!重要!.txt”。

    如果模式以斜线结尾,则将其删除以用于 以下描述,但它只会找到与 目录。换句话说, foo/ 将匹配目录 foo 和路径 在它下面,但不会匹配常规文件或符号链接 foo (这与 pathspec 的一般工作方式一致 吉特)。

    现在,假设我们有以下目录结构:

    /path/to/git/repo
    |-- .gitignore
    |-- /cache
        |-- somefile
        |-- README    
        |-- /dir
            |-- somefile2
            |-- README
    

    我们想忽略缓存/中的所有文件,除了 README 文件。

    如果我们这样指定 gitignore:

    /cache/**
    !README
    

    Git 将忽略除/cache/README 之外的所有内容。另一个 README 不会显示,因为它的目录 /cache/dir 被排除在 /cache/**!README 甚至不会适用于它。 为了解决这个问题,我们需要这样指定 gitignore:

    # Ignore everything inside cache/ dir
    /cache/**
    # Except for subdirectories(won't be commited anyway if there is no commited file inside)
    !/cache/**/
    # And except for README files
    !README
    

    【讨论】:

    猜你喜欢
    • 2018-05-18
    • 2011-06-04
    • 2013-07-22
    • 2011-08-18
    • 2022-11-16
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多