gpt4 book ai didi

gitignore 文件夹中的所有文件但保留文件夹结构

转载 作者:太空狗 更新时间:2023-10-29 12:58:59 32 4
gpt4 key购买 nike

我有以下文件夹结构:

/foo/
/foo/test.txt
/foo/.gitkeep
/foo/bar/test.txt
/foo/bar/.gitkeep
/foo/bar/baz/test.txt
/foo/bar/baz/.gitkeep

现在我想排除文件夹“foo”中的所有文件及其子文件夹(和子子文件夹)中的所有文件,除了所有 .gitkeeps(以便保留文件夹结构)。这也适用于超过 3 级的子文件夹。

以下 gitignore-rules 起作用:

/foo/**
!/foo/**/
!/foo/**/.gitkeep

有人可以解释一下,为什么这行得通吗?有更简洁的方法吗?

最佳答案

规则很简单:

It is not possible to re-include a file if a parent directory of that file is excluded.

这就是为什么你需要

  • 递归地忽略文件和文件夹:

    /foo/**

(如果您只忽略 /foo/,即文件夹,那么再多的“!”排除规则也不起作用,因为 foo/ 文件夹本身被忽略:Git 将停在那里)

  • 然后从忽略规则中排除文件夹:

    !/foo/**/
  • 之前 白名单文件,如 .gitkeep

    !/foo/**/.gitkeep

这是有效的,因为 .gitkeep 父文件夹被排除在忽略规则之外。

与 Bernardo 最初的提议 (before his edit) 相对:

/foo/** 
!**/.gitkeep

如果不从 /** 忽略规则中排除文件夹,则 files 的排除规则无效。

您可以通过以下方式检查:

git check-ignore -v -- /path/to/.gitkeep

scm .gitignore 中所述:

  • 使用“*”与“**”相同
  • 使用 !.gitkeep(没有任何/ anchor )将递归地排除该文件。

在这两种情况下,“recursively”是解释排除规则为何适用的关键术语:如果您忽略文件夹(如 ./foo/),您将无法排除该文件夹内的任何内容。
但是,如果您递归地(***)忽略元素(文件和文件夹),从中排除文件夹gitignore 规则(再次通过递归规则 !*),然后您可以排除(白名单)文件。

关于gitignore 文件夹中的所有文件但保留文件夹结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46301811/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com