【问题标题】:git ignore exceptiongit忽略异常
【发布时间】:2011-03-13 07:21:11
【问题描述】:

我有一个 gitignore 文件,它使 git 忽略 *.dll 文件,这实际上是我想要的行为。但是,如果我想要一个例外(即能够提交foo.dll),我该如何实现呢?

【问题讨论】:

标签: git gitignore


【解决方案1】:

用途:

*.dll    #Exclude all dlls
!foo.dll #Except for foo.dll

来自gitignore

可选前缀!这否定了模式;任何被先前模式排除的匹配文件都将再次包含在内。如果否定模式匹配,这将覆盖较低优先级的模式源。

【讨论】:

  • 另见答案表格@Matiss Jurgelis - 这是重要的补充
  • 我可以将异常添加到我的项目的 gitignore 而不是我的全局 gitignore 吗?例如,如果我想在一个目录中包含所有 DLL?我的 gitignore_global 里面有 *.dll,我项目的 gitignore 里面有 !Libs/*.dll 但这似乎不起作用。
  • @jkinz,你应该试试!Libs/**/*.dll
  • 谢谢,但在 Mac 上,在与 !foo.dll 相同的行添加注释确实使命令无效。如果我在单独的行上添加评论,它会起作用。
  • @Giacomo 我在 Windows 上也遇到过,# 应该避免使用。
【解决方案2】:

如果你写,Git 会忽略文件夹:

/js

但如果你这样做,它不能添加例外: !/js/jquery!/js/jquery/!/js/jquery/*

你必须写:

/js/* 

只有这样你才能排除这样的子文件夹

!/js/jquery

【讨论】:

  • 这很重要。谢谢!
  • 但是看起来你不能添加嵌套文件夹,例如!/js/jquery/xyzlib 不会被忽略...
  • 正如@Ignorant 所说,您从忽略规则中“排除”的文件夹必须与“*”位于同一位置
  • 所以/js/*!/js/jquery/js/jquery/*!/js/jquery/xyzlib?感觉是一种相当有趣的方式......
  • 你真的帮了我。
【解决方案3】:

您可以简单地git add -f path/to/foo.dll

.gitignore 仅忽略用于常规跟踪的文件和 git add . 之类的文件

【讨论】:

  • 更多细节,-f 告诉 git 强制在 repo 中添加这个文件,因为它可能会因为你的.gitignore而首先忽略它
  • 如果你只有一个文件,那就太好了,如果你需要一个模式,那就没那么有用了
  • 很高兴知道。但是管理 .gitignore 中的所有规则仍然比不知道某些规则在其他地方定义更好,尤其是在团队环境中
【解决方案4】:

要排除目录中的所有内容,但某些子目录,请执行以下操作:

wp-content/*
!wp-content/plugins/
!wp-content/themes/

来源:https://gist.github.com/444295

【讨论】:

    【解决方案5】:

    只需在排除规则前添加!

    根据gitignore man page

    模式具有以下格式:

    ...

    • 可选前缀!这否定了模式;任何被先前模式排除的匹配文件都将再次包含在内。如果否定模式匹配,这将覆盖较低优先级的模式源。

    【讨论】:

      【解决方案6】:

      !foo.dll 在 .gitignore 中,或(每次!)git add -f foo.dll

      【讨论】:

        【解决方案7】:

        如果您正在使用 Visual Studio 并且您的 .dll 恰好位于 bin 文件夹中,那么您需要为特定 bin 文件夹本身添加一个例外,然后才能为 . dll 文件。例如

        !SourceCode/Solution/Project/bin
        !SourceCode/Solution/Project/bin/My.dll
        

        这是因为默认的 Visual Studio .gitignore 文件包含 [Bbin]/ 的忽略模式

        此模式正在删除所有 bin 文件夹(以及它们的内容),这使得任何包含内容的尝试都是多余的(因为文件夹本身已被忽略)。

        我能够通过运行找到我的文件没有被排除在外的原因

        git check-ignore -v -- SourceCode/Solution/Project/bin/My.dll
        

        来自 Git Bash 窗口。这返回了 [Bbin]/ 模式。

        【讨论】:

          【解决方案8】:

          解决办法取决于git忽略规则和异常规则的关系:

          1. 文件/同级文件:使用@Skilldrick solution
          2. 文件夹/子文件夹:使用@Matiss Jurgelis solution
          3. 不同级别的文件/文件或文件/子文件夹:您可以这样做:

            *.suo
            *.user
            *.userosscache
            *.sln.docstates
            
            # ...
            
            # Exceptions for entire subfolders
            !SetupFiles/elasticsearch-5.0.0/**/*
            !SetupFiles/filebeat-5.0.0-windows-x86_64/**/*
            
            # Exceptions for files in different levels
            !SetupFiles/kibana-5.0.0-windows-x86/**/*.suo
            !SetupFiles/logstash-5.0.0/**/*.suo
            

          【讨论】:

            【解决方案9】:

            从 Git 2.7.0 开始,Git 会考虑异常情况。来自官方发布说明:

            • 允许后面的“!/abc/def”覆盖前面的“/abc” 出现在同一个 .gitignore 文件中以便于表达 “/abc 目录中的所有内容都将被忽略,除了 ...”。

            https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.7.0.txt

            编辑:显然这在 Git 2.8.0 之后不再起作用

            【讨论】:

            【解决方案10】:

            我就是这样做的,每个目录下都有一个 README.md 文件:

            /data/*
            !/data/README.md
            
            !/data/input/
            /data/input/*
            !/data/input/README.md
            
            !/data/output/
            /data/output/*
            !/data/output/README.md
            

            【讨论】:

              【解决方案11】:

              如果您有一个目录并且想要忽略除某些文件之外的所有内容(例如*.py 文件),您可以这样做:

              sub-dir/**/*.*
              !sub-dir/**/*.py
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-04-09
                • 1970-01-01
                • 2022-06-16
                • 2012-05-23
                • 2019-11-17
                • 2018-10-14
                • 2011-04-16
                相关资源
                最近更新 更多