【问题标题】:How do I tell Git to ignore everything except a subdirectory?我如何告诉 Git 忽略除子目录之外的所有内容?
【发布时间】:2010-11-17 22:15:15
【问题描述】:

我想忽略存储库中的所有文件,但bin 子目录中的文件除外。我尝试将以下内容添加到我的.gitignore

*
!bin/*

这并没有达到预期的效果,但是:我在bin/ 中创建了一个新文件,但执行git status 仍然显示nothing to commit (working directory clean)

有什么建议吗?

【问题讨论】:

标签: git gitignore


【解决方案1】:

您遇到的唯一问题是 bin 目录本身与 bin/* 模式不匹配,因此 git 甚至不会查看 bin 目录。

我想到了两种解决方案。

.gitignore

*
!/bin/
!bin/*

.gitignore

*
!/bin/

bin/.gitignore

!*

我更喜欢第二种解决方案,因为第一种解决方案不会停止忽略bin 目录中的文件,这些文件位于不称为bin 的子目录中。这对您的情况可能很重要,也可能无关紧要。

【讨论】:

  • 对我不起作用。我必须有一个这样的 .gitignore 才能使其工作:# Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* cmets 中没有块代码?
  • Tyler's answer 有更好的单文件解决方案
【解决方案2】:

我认为更好的方法是通过以斜线开头的模式将每个模式锚定到顶部 git 目录:

/*
!/public_html
!/.gitignore

它只会忽略顶级文件,而不是忽略所有文件,而不是您不想忽略的目录中的文件。

【讨论】:

    【解决方案3】:

    这个.gitignore 为我工作:

    */
    /*
    !bin/
    

    【讨论】:

      【解决方案4】:

      这会忽略根文件和根目录,然后取消忽略根 bin 目录:

      /*
      /*/
      !/bin/
      

      这样你就可以得到所有的 bin 目录,包括子目录和它们的文件。

      【讨论】:

      • 由于某种原因,这对我来说并不一致。我有两行/stuff/!/stuff/specific/,但它仍然忽略/stuff/specific/
      • @LB-- 我遇到了类似的问题,git check-ignore -v 告诉我这是因为~/.gitignore
      • /*/ 有必要吗?
      • 这对我不起作用。我必须将!/bin/ 添加到我的根.gitignore 文件中,但随后我还必须添加/bin/.gitignore 文件和!*... 仅进行其中一项更改不起作用。它只有在结合这两个更改后才有效。
      • @LB 和其他人,试试/stuff/*!/stuff/specific/。区别在于/stuff/ 告诉它忽略 stuff 目录本身,/stuff/* 说忽略 stuff 目录中的所有目录,然后不要忽略这个特定目录。这对我来说很重要。
      【解决方案5】:

      这里如何忽略某个目录中除一个目录“MY_SUPER_DUPER_TEMPLATE_directory”之外的所有内容

      结构:/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory

      /*
      !/bitrix
      /bitrix/*
      !/bitrix/templates
      /bitrix/templates/*
      !/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
      *.DS_Store
      *.gitignore
      

      【讨论】:

      • 这为忽略我修改过的 laravel 供应商包创造了奇迹!谢谢,你帮我省了很多麻烦
      • 这应该被选为最佳答案。
      【解决方案6】:

      您必须排除前往目的地途中的所有内容,但您必须包括目的地:

      注意:这是一个排除文件(即 .gitignore),因此逻辑是相反的。全部忽略,tsp目录除外,tsp目录中的全部忽略,src目录除外……

      /*
      !/tsp
      /tsp/*
      !/tsp/src
      /tsp/src/*
      !/tsp/src/*.h
      !/tsp/src/*.cpp
      !/tsp/src/data.txt
      !/.gitignore
      

      【讨论】:

      • +1 用于包含目录的原则,然后,排除它的内容,然后,包括所需的子目录等。我最终在我的项目中使用了这个答案。
      • 快进几年,您仍然必须如此冗长,感觉有点不对劲。指定最终目的地就足够了。
      【解决方案7】:

      在最新的 GIT 版本中尝试以下操作。

      *
      !*/
      !/path/to/your/dir/**
      

      【讨论】:

      • 最后一行应该是 !/path/to/your/dir/**
      • @faham,是的,刚刚添加。
      【解决方案8】:

      试试这个不起眼的 git 错误。

      !bin**/**
      

      希望对你有帮助:)

      支持文档git bug sample

      PS:先试试再评论。

      【讨论】:

        【解决方案9】:

        来自官方git doc,其中一个例子说:

        排除除特定目录 foo/bar 之外的所有内容的示例(注意 /* - 没有斜线,通配符也将排除 foo/bar 中的所有内容):

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

        有关前导斜杠的说明:When to use leading slash in gitignore

        【讨论】:

        • 谢谢一百万,这对我有用!请注意,这里的行顺序很重要,例如,您不能在 /foo/* 之前有 !/foo/bar。
        【解决方案10】:

        我最近不得不这样做:

        *
        !sub-dir/
        !sub-dir/*
        

        我不确定为什么我需要两行来排除一个文件夹,但这对我和 macos 都有效。

        【讨论】:

          【解决方案11】:

          这是我的解决方案。在我的场景中,我有一个包含子文件夹的文件夹,如下所示:

          • 数据库(主文件夹)
            • conf(子文件夹)
            • 驱动程序(子文件夹)
            • 罐子(子文件夹)
            • sql(子文件夹)

          我只想从 database 文件夹推送 sql 文件夹,所以我的 .gitignore 文件如下:

          database/*
          !database/sql/
          

          第一行简单地说忽略 database 文件夹的所有子文件夹,第二行表示忽略 database 的所有子文件夹文件夹排除(不要忽略)sql 子文件夹

          【讨论】:

            【解决方案12】:

            派对迟到了,但没有一个答案对我“开箱即用”。这个可以:

            * 
            !bin
            !bin/**
            
            • 第一行忽略所有内容
            • 第二行包含“bin”目录本身
            • 最后一行包含“bin”目录的全部内容,无论它是多么嵌套(注意双星号),

            【讨论】:

              【解决方案13】:

              事实证明,我不应该忽略父文件夹,而是使用 /* 忽略其中的文件和文件夹

              -- **/node_modules
              
              ++ **/node_modules/*
              

              然后

              ++ !node_modules/@my-package/
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-07-19
                • 2013-09-26
                • 1970-01-01
                • 2012-08-17
                • 2011-10-23
                • 2016-02-05
                • 2015-05-02
                • 2014-06-15
                相关资源
                最近更新 更多