git忽略异常

Posted

技术标签:

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

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

【问题讨论】:

Exceptions in .gitignore 的可能重复项 fwiw,关于这个主题的重复答案的祖父 - 你应该仔细查看 - 可能是Make .gitignore ignore everything except a few files - 非常有规律的活动和几个很好的答案。我是this answer 的特别粉丝,它看起来清晰透彻。 Make .gitignore ignore everything except a few files的可能重复 【参考方案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忽略规则和异常规则的关系:

    文件/同级文件:使用@Skilldrick solution。 文件夹/子文件夹:使用@Matiss Jurgelis solution。

    不同级别的文件/文件或文件/子文件夹:您可以这样做:

    *.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 之后不再起作用

【讨论】:

这对任何人都有效吗?似乎对我不起作用。 ***.com/q/53753201/125507 已删除【参考方案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

【讨论】:

以上是关于git忽略异常的主要内容,如果未能解决你的问题,请参考以下文章

如何找到被“忽略”的异常?

NLog LogException 似乎忽略了异常

忽略oracle触发器中的异常

线程忽略 KeyboardInterrupt 异常

如何让 WinForms 停止默默地忽略未处理的异常?

Automapper:忽略目标属性的验证异常