配置git仅跟踪一个文件扩展名

31

我有一个包含不同类型文件的目录树。父目录下有300个子目录,每个子目录下可能还有其他子目录。

我只想跟踪所有子目录中的 *.cocci 文件。这是我的 .gitignore 文件:

*
!*.cocci

但是它不起作用,因为子目录中的文件没有被跟踪。 我如何告诉 git 我只想在所有子目录中跟踪 *.cocci 文件?


你是否已经执行了 git add 命令来添加文件?仅仅设置 .gitignore 文件并不能自动跟踪文件... - twalberg
如果我使用 git add -f <file>,我才能添加文件。这似乎不正确... - Peter
可能是Git中的白名单和子目录问题的重复。 - daviesgeek
4个回答

49

阅读这个问题

您想要:

# Blacklist everything
*
# Whitelist all directories
!*/
# Whitelist the file you're interested in. 
!*.cocci 

注意,这样只会跟踪 *.cocci 文件。你的不起作用是因为你忽略了所有文件(这是第一行),这将忽略所有子目录


1
我仍然对git status的输出不满意,因为它不显示未被跟踪的文件夹内容,但是过滤器现在正在工作。谢谢。 - Peter
1
请您修改答案中的注释,让它们单独成行。如果您将此粘贴到 .gitignore 中,它将无法工作(在 v.1.9.1 上进行了测试)。请查看http://git-scm.com/book/zh/v2/Git-基础-记录更改到仓库#忽略文件。 - panepeter
3
您可能想将 .gitignore 加入白名单。 - Ken A

7
为了补充@simont的回答,如果我们想要添加指定目录及其子目录下的*.cocci文件至白名单中,我会错误地输入以下内容:
directory/*
!directory/*/
!directory/*.cocci 

似乎不包括目录/子树下的*.cocci文件。

为了在目录的所有子目录中找到所有*.cocci文件,请输入以下内容:

directory/**
!directory/*/
!directory/**/*.cocci 

1
太好了!这就是我要找的!为了更清晰,如果我想忽略除 ./directory/* 之外的所有内容,我应该放置 *; !directory/; !directory/* - Student

2

在 .gitignore 中使用 !dir 是无法取消忽略目录的,但是你仍然可以手动添加目录:

git add dir -f

所以,如果.gitignore文件看起来像这样:
*
!*.txt

当你执行 git add . 时,新的 *.txt 文件将被添加。新目录不会自动添加,必须通过手动执行 git add dir -f 来添加。


这解决了我的一个问题,即使我在.gitignore文件中设置了!dir/.exists文件,但一个目录仍然被忽略。请注意,上面答案中的dir应替换为您想要包含在git checkin中的目录名称。 - kenjikato

0

你试过使用!*/*.cocci而不是你的!*.cocci吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接