ChatGPT解决这个技术问题 Extra ChatGPT

.gitignore 和 .gitkeep 有什么区别?

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

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


K
Konrad Rudolph

.gitkeep 没有记录,因为它不是 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
M
Michael

.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

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

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

.gitkeep

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

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


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

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


可以说,约定的原因几乎是明确的,因为 git
@JDPeckham Perforce 还需要存在文件来跟踪文件夹。
S
Sohel Ahmed Mesaniya

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

https://i.stack.imgur.com/Smlxv.png

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

因此,例如,如果您有 /project/content/posts,有时 posts 目录可能为空,则创建没有内容的空文件 /project/content/posts/.gitignore 以跟踪该目录及其在 git 中的未来文件。


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