.gitignore 和 .gitkeep 有啥区别?

Posted

技术标签:

【中文标题】.gitignore 和 .gitkeep 有啥区别?【英文标题】:What are the differences between .gitignore and .gitkeep?.gitignore 和 .gitkeep 有什么区别? 【发布时间】:2011-11-05 23:47:01 【问题描述】:

.gitignore.gitkeep 有什么区别?它们是同一个东西但名称不同,还是它们都具有不同的功能?

我似乎无法在 .gitkeep 上找到太多文档。

【问题讨论】:

【参考方案1】:

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

Git cannot add a completely empty directory。想要在 Git 中跟踪空目录的人已经创建了将名为 .gitkeep 的文件放在这些目录中的约定。该文件可以被称为任何东西; Git 对这个名称没有特殊意义。

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

【讨论】:

README 文件放在包含有关该子目录将用于什么的一些信息的其他空子目录中不是更好的解决方案吗?有一个名为 .gitkeep 的文件实际上不是 git 的一部分,这似乎令人困惑。 @tamouse 很多时候,空目录的路径(例如文件夹的名称)足以表达它的目的(例如:模板/缓存,上传/拇指等)。在这些情况下,将自述文件放入其中感觉是多余的。 想要跟踪空目录的人应该在自述文件中指出必须创建目录或使用他们的构建工具或任何需要目录存在的工具来创建目录; / @tamouse, @omouse:一个有两行的.gitignore 文件:*!.gitignore 足以清楚地传达正在发生的事情。如果需要详细说明,请使用 # 语法在文件顶部添加注释。 值得注意的是,流行的 Rails 框架稍微改变了这个约定,使用 .keep 文件而不是 .gitkeep 来保留这些空文件夹,因为 git 不是唯一不这样做的源代码控制系统跟踪空文件夹。更多细节在这里:github.com/rails/rails/issues/2800【参考方案2】:

.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

('#'表示cmets。)

【讨论】:

我自己也喜欢这种做法。如果这些目录中有源代码,则不需要 .gitkeep 并且通常它是 temp/cache/user 内容,无论如何都会在测试期间生成,导致您还必须 .gitignore 这些文件 为什么!前面需要.gitignore?是为了逃避点吗? @Will - 不,! 否定以下部分,就像它通常在编程中所做的那样。 没有必要把!.gitignore放到一个git忽略文件中,要么添加文件然后编辑它,要么用适当的内容强制添加它(“*”忽略所有内容,或者什么都不简单确保文件夹存在)further example. 来自您的链接:Since the git ignore file is already in the repo it is not necessary to not-ignore it - it is already tracked. ------ 如果不是,并且您没有进行强制添加,您可能会忘记它。在微不足道的情况下,没问题,但如果它是一个更大的文件,你可能会感到不安。使用!.gitignore 可以防止你在自己的脚下开枪。我更喜欢它,过去曾烧伤过自己。【参考方案3】:
.gitignore

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

.gitkeep

由于 Git 会删除或不向存储库添加空目录,因此 .gitkeep 是一种将空目录保留在存储库中的技巧(我不认为它被正式命名为 Git 的一部分)。

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

【讨论】:

如果您不想每次都指定每个文件夹的完整路径,您可以拥有任意数量的.gitignores。 我尝试在.gitkeep 文件中提及空目录列表,但它不会跟踪空目录,仅跟踪.gitkeep 文件所在的文件夹。为什么会这样? .gitkeep 不像 .gitignore 那样工作。它不是要保留的目录列表。它只是一个空文件,位于您要保留的目录中。它可以命名为任何你想要的 .keep 等。所以你可以有一个像 /foo/bar 这样的目录,而 gitkeep 文件将是 /foo/bar/.gitkeep @sjas 拥有多个.gitignores 如何让您不必每次都指定每个文件夹的完整路径?我想我遗漏了一些明显的东西。 @Willwsharp 假设你有 /abc/def/somefile.如果您的 git 在 /abc/ 中,则必须忽略 ./dev/somefile。如果你把你的 gitgnore 放在 /abc/def 里面,那么你只需要忽略 ./somefile【参考方案4】:

许多人更喜欢只使用.keep,因为约定与 git 无关。

【讨论】:

可以说,约定的原因几乎明确是因为 git【参考方案5】:

这不是对原始问题“.gitignore 和 .gitkeep 有什么区别?”的回答。但是在这里发布以帮助人们以简单的方式跟踪空目录。跟踪空目录并知道.gitkeep 不是git 的官方部分,

只需在其中添加一个空(没有内容).gitignore 文件。

所以例如如果你有 /project/content/posts 并且有时 posts 目录可能是空的,那么创建一个空文件 /project/content/posts/.gitignore 没有内容来跟踪该目录及其在 git 中的未来文件。

【讨论】:

我不同意。 .gitkeep 不是 git 的官方部分这一事实绝对不是滥用 .gitignore 的理由。空的 .gitignore 令人困惑且毫无意义。其中一个空的 .gitkeep 显然是一个占位符,用于在 git 中“保留”目录。 我相信你的观点并非全部 明确地说,您的观点是可以(或一个好主意)扩展官方.gitignore 文件用途,以便在空时兼作占位符?就像我说的,我不能再不同意了。也许您可以编辑您的答案以解释您的推理或支持您的观点?现在这是一个毫无根据的答案,完全值得我投反对票。 啊,我意识到我无意中卷入了一场公约战争。我刚刚注意到已接受答案中的 cmets。也许这里有两个约定,也许每个约定都有自己的追随者数量,因此受欢迎程度不同。我仍然想听听这个大会的论点,因为也许我会改变主意。 我明白了。但是你能在官方 Git 文档中显示它指导人们添加空的 .gitignore 文件吗?

以上是关于.gitignore 和 .gitkeep 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Java 中 给一个object 赋值属性, 既可以用构造函数的方式,也可以用setXXXX()的方式,而它们之间有啥区

git提交空目录

.gitignore 文件中的单 /* 和双 /** 尾随星号有啥区别?

steam账号分国家地区吗 怎么看自己的账号是啥区

.gitkeep文件的作用

Git.gitkeep简介及用法