Git中的白名单和子目录

Nat*_*ate 78 git gitignore

我只为文本文件创建了一个白名单.

*
!*.txt
Run Code Online (Sandbox Code Playgroud)

现在,我在子目录中有一个未跟踪的文本文件 - sub/dir/file.txt并且未显示(忽略它).但是,会显示根目录中的文本文件.

为什么会这样,我该如何解决?

sim*_*ont 124

如果你这样尝试,它就会失败,因为你最终会将结构中的目录列入黑名单.

要解决此问题,您希望将不是目录的所有内容列入黑名单,并且不是要提交的文件类型之一,而不是将目录列入黑名单.

.gitignore将执行此操作的文件:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc
Run Code Online (Sandbox Code Playgroud)

.txt在存在的文件的三级结构白名单中测试了这个*.one,*.two并且*.three使用.gitignore位于存储库的根目录中的文件 - 对我有用.您不必将.gitignore文件添加到结构中的所有目录.

我用来找出答案信息的来源,除其他事项外,(stackoverflow.com).

  • 使用`*`时还需要输入`!.gitignore`,不是吗? (14认同)
  • 在这里查看我的答案:http://stackoverflow.com/questions/987142/make-gitignore-ignore-everything-except-a-few-files/29932318#29932318使用`/ *`只是将其列入黑名单可能更为有用顶层文件夹,但不是所有文件夹都是递归的,这实际上意味着`.gitignore`不应查看列入白名单的文件夹的子文件夹。 (2认同)

Sha*_*adh 5

实现这一目标的更简单方法是:

# Ignore all files...
*.*

# ...except the ones we want
!*.txt
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为gitignore将不以开头的模式应用于文件/下的每个级别.gitignore

如果模式的开头或中间(或两者)有分隔符,则模式是相对于特定 .gitignore 文件本身的目录级别的。否则模式也可能在低于 .gitignore 级别的任何级别匹配。

如果您想对目录中的文件执行此操作,事情会变得更加复杂:

# Ignore all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为gitignore有以下特殊规则**

**与完整路径名匹配的模式中的两个连续星号 (" ") 可能具有特殊含义:

  • 斜杠后跟两个连续的星号,然后斜杠匹配零个或多个目录。例如,“ a/**/b”匹配“ a/b”、“ a/x/b”、“ a/x/y/b”等。

关键是确保您不要忽略目录,因为无论其他规则如何,该目录中的每个文件都会被忽略。

  • “*.*”的注释是错误的。它应该是“忽略所有有句点的文件/文件夹”。Glob 模式不支持文件识别;它们**只能**通过使用尾部斜杠来识别文件夹。 (2认同)