.gitignore和.gitkeep有什么区别?


1924

.gitignore和之间有什么区别.gitkeep?他们是同一个名字不同的事物,还是两者都发挥不同的作用?

我似乎在上找不到太多文档.gitkeep

Answers:


3435

.gitkeep 没有记录,因为它不是Git的功能。

Git 无法添加一个完全空的目录。想要在Git中跟踪空目录的人已经创建了将被调用文件.gitkeep放在这些目录中的约定。该文件可以被称为任何东西。Git对该名称没有特别的意义。

.gitignore在空目录中添加文件以对其进行跟踪是一种相互竞争的约定,但是有些人认为这令人困惑,因为目标是保留空目录,而不是忽略它们。.gitignore还用于列出查找未跟踪文件时Git应该忽略的文件。


414
README文件放在否则为空的子目录中是否包含一个有关该子目录将要使用的信息的更好的解决方案,这不是更好的解决方案吗?拥有一个.gitkeep实际上不是git一部分的文件似乎令人困惑。
tamouse

423
@tamouse很多时候,空目录的路径(例如文件夹的名称)足以表达其目的(例如:模板/缓存,上载/缩略图等)。在这些情况下,将自述文件放入其中的每一个感觉都是多余的。
HalilÖzgür13年

16
想要跟踪空目录的人应该在README中指示必须创建目录或使用其构建工具或任何需要该目录存在的工具创建目录; /

32
@ tamouse,@ omouse:一个.gitignore包含两行的文件:*并且!.gitignore足够清楚地传达正在发生的事情。如果需要更多说明,请使用# 语法在文件顶部添加注释。
Droogans

63
值得注意的是,流行的Rails框架使用.keep文件而不是.gitkeep保留这些空文件夹稍微改变了此约定,因为git并不是唯一不跟踪空文件夹的源代码控制系统。此处有更多详细信息:github.com/rails/rails/issues/2800
Claudio Floreani

330

.gitkeep只是一个占位符。虚拟文件,因此Git不会忘记目录,因为Git仅跟踪文件。


如果您想要一个空目录并确保它对Git保持“干净”,请在.gitignore其中创建一个包含以下行的目录:

# .gitignore sample
###################

# Ignore all files in this dir...
*

# ... except for this one.
!.gitignore

如果您只希望Git可以看到一种文件,这是一个示例,该示例说明如何过滤掉除.gitignore和所有.txt文件以外的所有内容:

# .gitignore to keep just .txt files
###################################

# Filter everything...
*

# ... except the .gitignore...
!.gitignore

# ... and all text files.
!*.txt

(“#”表示注释。)


3
我自己喜欢这种练习。如果这些目录中有源代码,则不需要.gitkeep,一般来说,它是临时/缓存/用户内容,在测试过程中始终会生成这些内容,导致您也必须.gitignore这些文件
chrisan 2012年

1
为什么需要!在前面.gitignore?是为了逃避点吗?
2012年

7
@Will-不,!否定以下部分,就像在编程中一样。
sjas 2012年

3
不需要!.gitignore添加gitignore文件,添加文件然后对其进行编辑,或者强制添加具有适当内容的文件(“ *”忽略所有内容,或者什么也不简单地确保文件夹存在)进一步的示例
2014年

13
从您的链接:Since the git ignore file is already in the repo it is not necessary to not-ignore it - it is already tracked.------如果不是,并且您没有进行强制添加,则可能会忘记它。在平凡的情况下,没问题,但是如果文件较大,您可能会感到沮丧。使用!.gitignore可以防止您用脚射击。我更喜欢它,过去曾经烧死自己。
sjas 2014年

125
.gitignore

是一个文本文件,包含您目录中的文件列表,git会忽略该文件,也不会在存储库中添加/更新。

.gitkeep

由于Git会删除或不向存储库中添加空目录,因此.gitkeep有点像将其保留在存储库中的hack(我不认为它是Git的正式名称)。

只需执行一次touch /path/to/emptydirectory/.gitkeep添加文件,Git现在就可以在存储库中维护此目录。


18
.gitignore如果不想每次都指定每个文件夹的完整路径,则可以有任意多个。
sjas 2012年

1
我尝试在.gitkeep文件中提及空目录列表,但它不会跟踪空目录,仅会跟踪文件所在的.gitkeep文件夹。为什么这样 ?
Pardeep Jain

2
.gitkeep不能像.gitignore一样工作。这不是要保留的目录列表。它只是一个空文件,位于您想保留的目录中。它可以命名为任何您想要的.keep等。因此,您可以拥有/ foo / bar之类的目录,而gitkeep文件将为/foo/bar/.gitkeep
Jim Munro

@sjas具有多个.gitignores将如何避免您每次都指定每个文件夹的完整路径?我想我缺少明显的东西。
Willwsharp
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.