正确地递归忽略特定文件夹下的所有文件,特定文件类型除外

Posted

技术标签:

【中文标题】正确地递归忽略特定文件夹下的所有文件,特定文件类型除外【英文标题】:Correctly ignore all files recursively under a specific folder except for a specific file type 【发布时间】:2013-07-22 16:07:45 【问题描述】:

我见过类似的问题(1、2 和 3),但我没有从他们那里得到适当的解决方案。

我需要忽略特定文件夹下的所有文件,特定文件类型除外。该文件夹是根路径的子目录。让我将文件夹命名为Resources。由于我不想使事情复杂化,所以让我忽略所有名为 Resources 的文件夹下的文件。

这是最常见的解决方案(在所有重复的问题中)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

这个解决方案的问题是它停止跟踪新添加的文件(因为* 忽略所有文件)。我不想继续排除每种文件类型。我想要正常的行为,如果添加了任何新文件,git status 会显示它。

我终于找到了解决方案here。解决方案是在Resources 文件夹中添加另一个.gitignore 文件。这可以正常工作。

我可以用一个忽略文件来达到同样的效果吗?我发现在不同的目录中有许多忽略文件有点笨拙。

这就是我想要实现的目标:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

但这给出了相反的输出。它会忽略 *.foo 类型并跟踪其他文件。

【问题讨论】:

【参考方案1】:

最好的答案是在 Resources 下添加一个 Resources/.gitignore 文件,其中包含:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

如果您不愿意或无法添加该 .gitignore 文件,则有一个不优雅的解决方案:

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

如果添加的目录比指定的更深,则需要编辑该模式。

【讨论】:

很伤心..确实我会有更深的目录,所以我会坚持第一个:( 在此处查看有关相同解决方案的更多详细信息:***.com/questions/7803689/… -- 上面也由 OP @nawfal 链接【参考方案2】:

@SimonBuchan is correct.

由于 git 1.8.2,Resources/** !Resources/**/*.foo 有效。

【讨论】:

这对我有用,稍微调整一下,我只需要删除目录和它们下面的所有东西,所以我为每个目录做了:DirectoryName1/** DirectoryName1/**/*。第一个删除目录,但您需要第二个删除所有文件类型。【参考方案3】:

这可能看起来很愚蠢,但请检查您之前是否尚未将尝试忽略的文件夹/文件添加到索引中。如果你这样做了,不管你在 .gitignore 文件中放了什么,文件夹/文件仍然会被暂存。

【讨论】:

如果有人遇到这个特定的用例,您可以使用git rm --cached <path to files> 从 git 中清除那些被忽略的文件,同时仍将它们留在文件系统中。【参考方案4】:

要么我做错了,要么接受的答案不再适用于当前的 git。

我实际上已经找到了合适的解决方案并将其发布在几乎相同的问题here 下。欲了解更多详情,请前往那里。

解决方案:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo

【讨论】:

是的,这对我有用。添加!/Resources/**/ 对于让 git 不忽略子目录至关重要。 我同意你的观点,Jim G 给出的解决方案在我的情况下是无效的。查阅了官方文档后,我认为无效的原因是那些目标文件的父目录仍然被忽略,所以使用感叹号无效,然后我看到了你的回答。我可以在这里完美地工作。跨度>

以上是关于正确地递归忽略特定文件夹下的所有文件,特定文件类型除外的主要内容,如果未能解决你的问题,请参考以下文章

java 20 -3 递归之删除特定目录下的特定文件

git 忽略特定类型的所有文件,特定子文件夹中的文件除外

java 20 -2 递归之找特定目录下的特定格式文件

使用批处理文件在目录下递归删除所有特定类型(扩展名)的文件

grep 递归查找 Linux 上的特定文件类型

10 Git中忽略特定的文件