有没有办法告诉git只包括某些文件而不是忽略某些文件?


164

我的程序通常会生成巨大的输出文件(〜1 GB),我不想备份到git存储库。因此,而不是能够做

git add .

我必须做类似的事情

git add *.c *.cc *.f *.F *.C *.h *.cu

这有点麻烦...

我非常有信心,我可以将快速的perl脚本ls目录内容写入.gitignore,然后根据.gitinclude(或类似名称)文件删除文件,但这似乎有点过于骇人听闻。有没有更好的办法?

Answers:


230

我不需要自己尝试一下,但是从我对TFM的阅读中可以看出,否定的模式可以满足您的要求。您可以使用稍后否定的条目覆盖.gitignore中的条目。因此,您可以执行以下操作:

*.c
!frob_*.c
!custom.c

要使它忽略除custom.c以外的所有.c文件以及以“ frob_”开头的任何文件


20
谢谢,TED。我要做的就是以*开头.gitignore文件,然后列出所有包含的文件模式,并以感叹号开头。
黛西·索菲亚·霍尔曼(D菊花)

8
文件夹呢?我找不到否定规则来在其中包含文件夹和文件的方法。
Marcio Cruz


2
非常好。我正在用它在我的主文件夹中有一个存放vimrc和bashrc之类的存储库
Martin Capodici 2015年

1
如果您要包括一个特定的文件夹,则@uzsolt不起作用。请参阅stackoverflow.com/questions/987142/…–
DiCaprio

73

在您的存储库中创建.gitignore文件,并且您只想跟踪c文件并忽略所有其他文件,然后向其中添加以下行...。

*
!*.c

'*'将忽略所有文件

和!将否定文件被忽略....所以在这里,我们要求git不要忽略c文件...。


您还需要.*隐藏文件吗?
trusktr 2013年

2
*即使对于.,该也是通配符,因此隐藏文件也将被忽略,但是所有以结尾的隐藏文件.c都将包括在内。
罗默2014年

2
使用这种方法,我认为来自子文件夹的文件也将被忽略。检查更多详细信息stackoverflow.com/a/11853075/739436
Stelian

1
我在主目录中使用此方法仅跟踪我的.bashrc和.bash_history,例如, *之后 !.bash*是.gitignore文件
user5359531 2016年

1
您可能需要*.*在Windows上-查看@Smaranjit Maiti的回答
Martin Capodici

13

实现这一目标的最佳解决方案

.gitignore在存储库中创建文件root,如果只想包含.c文件,则需要在.gitignore文件中添加以下几行

*.*
!*.c

这将.c递归包括目录和子目录中的所有文件。

使用

*
!*.c

不适用于所有版本的git。

经过测试

git版本2.12.2.windows.2


2
是的,我有同样的问题*,必须使用*.*。这是在Windows上使用gitbash和git版本2.9.0.windows.1
Martin Capodici

2

如果您需要忽略文件而不是目录中的特定文件,请按以下步骤操作:

# Ignore everything under "directory"
directory/*
# But don't ignore "another_directory"
!directory/another_directory
# But ignore everything under "another_directory"
directory/another_directory/*
# But don't ignore "file_to_be_staged.txt"
!directory/another_directory/file_to_be_staged.txt

0

晚了,但是我的解决方案是为源文件提供一个目录,为可执行文件和程序输出提供一个不同的目录,如下所示:

+ .git
|    (...)
+ bin
|    my_exe.exe
|    my_output.txt
+ src
     some_file.c
     some_file.h 

...然后仅将内容添加src/到我的存储库中,然后bin/完全忽略。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.