What are the differences between .gitignore and .gitkeep?
.gitignore和.gitkeep有什么区别?它们是具有不同名称的相同事物,还是都具有不同的功能?我似乎找不到关于.gitkeep的很多文档。
.gitkeep没有文档记录,因为它不是git的特性。
Git无法添加完全空的目录。想要在Git中跟踪空目录的人已经创建了将名为.gitkeep的文件放入这些目录的惯例。这个文件可以被称为任何东西;git对这个名称没有特殊意义。
在空目录中添加.gitignore文件以跟踪它们是一种竞争惯例,但有些人认为这很混乱,因为目标是保留空目录,而不是忽略它们;.gitignore还用于列出在查找未跟踪文件时Git应忽略的文件。
- 信息丰富。我在等.gitkeep标记您要保留的那些.gitignore文件,使其与其他.gitignore文件不同,后者应该/可以在分支签出后删除。
- 把一个README文件放在另外一个空的子目录中,这个空的子目录包含一些关于该子目录将用于什么的信息,难道不是更好的解决方案吗?有一个名为.gitkeep的文件实际上不是git的一部分,这似乎令人困惑。
- @很多时候,空目录的路径(例如文件夹的名称)足以表达它的用途(例如:模板/缓存、上载/拇指等)。在这些情况下,将自述文件放入其中的每一个都是多余的。
- 想要跟踪空目录的人应该在自述文件中指出必须创建目录,或者使用构建工具或任何需要目录存在的工具创建目录;/
- @Tamouse,@omouse:.gitignore文件,有两行:*和!.gitignore,其清晰程度足以传达正在发生的事情。如果需要更详细的说明,请使用# 语法在文件顶部添加注释。
- @Tamouse放置一个README文件是让Git跟踪空文件夹的最佳解决方案。
- 值得注意的是,流行的Rails框架使用.keep文件(而不是.gitkeep文件)来保留这些空文件夹,稍微改变了这一惯例,因为Git不是唯一不跟踪空文件夹的源代码管理系统。更多详情请访问:github.com/rails/rails/issues/2800
- 我只是打电话给我的文件.empty。我想这更有道理,至少对我来说。
- 我同意@droogans。我不认为.gitignore令人困惑。与此相反,它意味着您希望保留文件夹并忽略其内容。.gitkeep并不能防止意外地对一次性文件进行版本控制。
- 就我个人而言,一个名为.gitkeep的包含文本的文件(如自述文件中所示)对我来说最有意义。gitkeep的名字一旦你了解了惯例就很明显了,如果你好奇的话,你可以打开这个文件。自述文件的目的过于笼统。
- 我觉得这里有两个用例我们在争论。如果有一个文件夹最终会充满跟踪的项目,那么.gitkeep比.gitignore更有意义,因为你不会忽略任何东西,所以你只需要把文件夹放在那里。但是,如果文件夹永远不会跟踪其中的文件,那么忽略这些文件的.gitignore是最有意义的。
- .keep也是一个更一般的空文件,不特定于git。我用这个到处看看。
- 我的发布工程师在一些目录中添加了自述文件,以便跟踪这些目录。现在,如果没有删除自述文件,Android项目将无法构建…仅供参考…
- @鲁道夫拉那将是一个可怕的,.gitkeep是跟踪空目录的简单而有效的方法。
- @enercio.keep和.gitkeep可以工作,但是我的观点是不变的,构建工具和自述文件应该反映将要创建的新目录。
- 我试图在.gitkeep文件中提到空目录列表,但它不会跟踪空目录,只跟踪.gitkeep文件所在的文件夹。为什么?
- @请仔细阅读答案。.gitkeep什么都不做。Git不读取其内容来决定保留什么,它只将文件作为常规文件进行跟踪。
- 如果我在目录中看到一个自述文件,我会删除它而不是来这里。
- 正如@ternovi提到的,自述文件容易干扰自动化。与其他自述文件相比,使用隐藏的.files文件更可取。
- 我最近发布了一个很小的实用程序cli来帮助递归地创建和删除.gitkeep文件。你可以在这里找到它:pypi.org/project/gitkeep2。您可以通过运行pip3 install gitkeep2来安装它,然后通过运行gitkeep path/to/foo来使用它。它支持递归和向.gitkeep文件中添加消息,以使它们成为自文档。
- 本公约是否附有特定的启发式框架?我的意思是,我可以放置任何文件,只要它符合当前的项目约定。有什么特别的理由支持.gitkeep,与其他不同,比如readme.md(我们已经知道普通的readme会导致自动化问题)?
.gitkeep只是一个占位符。一个虚拟文件,因此Git不会忘记该目录,因为Git只跟踪文件。
如果您想要一个空目录,并确保它对git保持"干净",那么创建一个包含以下行的.gitignore:
1 2 3 4 5 6 7 8
| # .gitignore sample
###################
# ignore all files in this dir...
*
# ... except for this one.
!.gitignore |
如果您希望只有一种类型的文件对Git可见,下面是一个示例,如何筛选出除.gitignore和所有.txt文件以外的所有文件:
1 2 3 4 5 6 7 8 9 10 11
| # .gitignore to keep just .txt files
###################################
# filter everything...
*
# ... except the .gitignore...
!.gitignore
# ... and all text files.
!*.txt |
。
""表示注释。)
- 我自己也喜欢这个练习。如果这些目录中有源代码,那么就不需要.gitkeep和general,而是temp/cache/user内容,在测试期间,这些内容无论如何都会生成,因此您也必须.gitignore这些文件。
- 你为什么要在.gitignore前面用!呢?这是为了避开这个点吗?
- @will-no,!否定了下面的部分,就像它通常在编程中那样。
- 不需要将!.gitignore放在git-ignore文件中,要么添加文件然后编辑它,要么强制添加包含适当内容的文件("*"忽略所有内容,要么什么也不做,只需确保文件夹存在)进一步的示例。
- 从你的链接:Since the git ignore file is already in the repo it is not necessary to not-ignore it - it is already tracked.——如果不是,而且你不做有力的添加,你可能会忘记它。在一些小的情况下,没问题,但是如果是一个更大的文件,您可能会感到不安。使用!.gitignore可以防止你用脚射自己。我更喜欢过去烧了自己的。
- (..)A dummy file, so git will not forget about the directory, since git tracks only files.(..)嗯..在Linux世界中,一切都是一个文件。别忘了Git是由最初创建Linux的人创建的。
- 它不必是空的。我发现让.gitkeep文件存储文本解释为什么这个目录在源代码管理中很重要是很有用的。我已经编写了一个小实用程序,它可以很容易地创建自编档的.gitkeep文件,例如gitkeep path/to/foo -m"This is where we'll later add X stuff.",您可以在pip3 install gitkeep2上安装它,并在pypi.org/project/gitkeep2上找到它。
是一个文本文件,包含目录中Git将忽略或不在存储库中添加/更新的文件列表。
号
因为Git删除或不向回购中添加空目录,所以GitKeep在回购中保留空目录有点像黑客(我认为它不是正式命名为Git的一部分)。
只需做一个touch /path/to/emptydirectory/.gitkeep来添加文件,Git现在就可以在存储库中维护这个目录了。
- 如果您不想每次都指定每个文件夹的完整路径,那么您可以拥有任意多的.gitignore。
- 我试图在.gitkeep文件中提到空目录列表,但它不会跟踪空目录,只跟踪存在.gitkeep文件的文件夹。为什么?
- .GitKeep的工作方式与.GitIgnore不同。它不是要保留的目录列表。它只是一个空文件,位于您想要保留的目录中。它可以被命名为任何你想要的.keep等等,这样你就可以有一个目录,比如/foo/bar,而gitkeep文件将是/foo/bar/.gitkeep。