如何在Git中仅从根文件夹中排除文件

582

我知道使用 .gitignore 文件来排除某些文件被添加,但是我在源代码树中有几个 config.php 文件,我需要排除其中一个,它位于根目录下,而其他文件要保留进行版本控制。

我应该在 .gitignore 文件中写什么内容来实现这一点?

在.gitignore文件中添加以下行: /config.php ,这将忽略位于根目录下的config.php文件,而其他的config.php文件将继续进行版本控制。
5个回答

826

文档中得知:

如果模式不包含斜杠 /,git 将其视为 shell glob 模式,并针对路径名相对于 .gitignore 文件的位置(如果不是来自 .gitignore 文件,则相对于工作树的顶级)检查匹配项。

前导斜杠匹配路径名的开头。例如,“/*.c”与“cat-file.c”匹配但不与“mozilla-sha1/sha1.c”匹配。

因此,您应该将以下行添加到根目录下的 .gitignore 文件中:

/config.php

2
谢谢!我尝试过这种方式,但由于某些原因它没有起作用。可能是我在某个地方输入有误了 =) - Pavel Karoukin
2
如果不是文件而是文件夹,我想在仓库根目录中忽略该文件夹、其包含的文件以及所有后代子文件夹和它们的文件怎么办?/folder/ - CodeManX
28
无论是/folder/还是/folder都可以使用,但在末尾添加斜杠会将匹配限制为仅文件夹。如果您在根目录中有一个名为“foo”的文件,则/foo/不会忽略它,但/foo会忽略它。 - tehDorf
4
如果您已经提交了文件,请运行命令git rm --cached <file>,否则该文件不会被忽略。来源:https://dev59.com/pXM_5IYBdhLWcg3wrFMt#1274447 - Bruno Polo
修改.gitignore文件后,运行命令git rm --cached <file>!这个方法对我有效。 - TangHongWan

107

请使用/config.php文件。


44

旧版本的git要求您首先定义一个忽略模式,然后立即(在下一行)定义排除。 [在版本1.9.3(Apple Git-50)上测试]

/config.php
!/*/config.php

后续版本只需要以下步骤[在2.2.1版本上进行了测试]

/config.php

如果您想在项目的顶层忽略一个文件但不想在较低级别忽略它,那么第一个语法也非常有用。 - light24bulbs

28

如果上述解决方案对您不起作用,请尝试这个:

#1.1 Do NOT ignore file pattern in  any subdirectory
!*/config.php
#1.2 ...only ignore it in the current directory
/config.php

##########################

# 2.1 Ignore file pattern everywhere
config.php
# 2.2 ...but NOT in the current directory
!/config.php

这对我确实有效,而仅使用/config.php却没有。我很好奇为什么会这样。你有什么想法吗? - iago-lito
如果您正在处理某个特定项目并且在其中遇到了如何忽略某个目录中的某些文件.ext,同时又不想在其他地方忽略它的问题,那么请将以下内容添加到/home/me/.gitignore文件中:/home/me/path/to/my/project/some/folder/file.ext或file.ext以在任何地方都忽略该文件,然后在/home/me/path/to/my/project/some/folder/.gitignore文件中添加!file.ext以仅在此特定目录中不忽略此文件。每个文件夹都可以有自己的.gitignore文件来覆盖任何父级.gitignore文件的设置... - drugan
嗯,这意味着仓库的行为可能会因其他用户在自己的机器上拥有不同的~/.gitignore文件而有所不同,对吧?此外,我的观点是:你写道“如果上述解决方案不起作用”,为什么会不起作用呢? - iago-lito
是的,如果您的项目可能存在于未知环境中,则不应依赖于存在于项目根文件夹上方的.gitignore文件。请记住,像config.php这样的文件名非常常见,因此请在根目录的.gitignore文件中覆盖任何可能存在的设置。 - drugan
@iago-lito 考虑离开,请参阅 https://dev59.com/2XA65IYBdhLWcg3wyRuk#28000594 - Malcolm
@drugan 在 SO 上的回答可能会根据排名而不事先通知地更改其顺序,并且也可以重新排序(与论坛不同,论坛的排序是按时间顺序固定的)。不要使用“上面”或“下面”,直接通过链接和/或作者姓名引用答案。 - ADTC

0
一个 WordPress 网站的示例,但基本上忽略一切,然后添加以 ! 开头的异常来指定要包含的内容。
# Ignore everything in the root except the "wp-content" directory.
/*
!.gitignore
!wp-content/
!wp-config.php
#
# # Ignore everything in the "wp-content" directory, except the "plugins"
# # and "themes" directories.
wp-content/*
!wp-content/plugins/
!wp-content/themes/
#
# # Ignore everything in the "plugins" directory, except the plugins you
# # specify (see the commented-out examples for hints on how to do this.)
wp-content/plugins/*
# # !wp-content/plugins/my-single-file-plugin.php
# # !wp-content/plugins/my-directory-plugin/
#
# # Ignore everything in the "themes" directory, except the themes you
# # specify (see the commented-out example for a hint on how to do this.)
wp-content/themes/*
!wp-content/themes/twentyeleven/

你可以只写一行 !wp-content/themes/twentyeleven/,而不是写成这样:!wp-content/wp-content/*!wp-content/themes/wp-content/themes/*!wp-content/themes/twentyeleven/。这样做的效果是一样的,对吧? - ADTC

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