为什么Git不会对目录进行版本控制?

9
我知道git不能在空目录上工作(这是一个比较流行的git问题之一),但我想知道不跟踪目录是否有特定的理由或原理(如果可能的话,官方的)。
我问这个问题是因为在某些情况下,目录本身可以具有有意义的元数据。例如,如果使用粘性模式,目录的文件模式可能很重要。一个目录是空的这个事实可能对应用程序很重要。
3个回答

12

没有官方的解释。Git FAQ只是简单地说明:

没有一个足够称职的人关注并解决了这个问题,允许空目录的更改

Git FAQ


5
Git追踪内容,文件夹/目录不是内容。虽然您是正确的,一些元数据可能对您很有用。在这种情况下,建议在目录中添加一个.gitignore文件或其他无意义的文件,以提供Git将识别的内容。
请参见如何向Git存储库添加空目录? 这就是Git设计的工作方式。
在我以前做的一些Web项目中,我需要一个记录PHP的日志目录,当然也忽略了.log文件,因此在本质上,我有一个空的日志目录,由于我的vhost设置,Apache需要该目录以便正确运行。
在这种情况下,我添加了一个没有内容的readme.txt。
我相信您已经在其他线程中看到了这个答案,但还是值得一个链接: https://dev59.com/QnVD5IYBdhLWcg3wBWzd#115992

2
将文件放入目录中不会保留目录的模式/元数据。你所做的只是确保在 git clone期间创建该目录。 - benzado
1
我知道Git是一个内容跟踪器,但它仍然可以跟踪目录...我想了解为什么它被特别设计成这样。 - nneonneo
好的观点。如果您需要在这样的结构中使用git,那么您的程序需要知道存在幽灵文件。 - Daniel
它不会在文件夹中保存任何数据,但有时候工具会失败,当目录没有被创建时,因此有时候最好确保目录结构在克隆时能够自我复制。 - Gustavo Litovsky
2
+1,但更常见的保留空目录的方法是在其中添加一个.gitignore文件。一些人开始使用一个名为.gitkeep的空文件来实现这个目的。但我认为这是一种丑陋的做法。只需使用一个.gitignore文件即可,它是一个单一的通用Git文件,如果需要,您可以在文件中添加本地忽略。 - Abizern

4

Git是一个“愚蠢的内容跟踪器”。它的设计基于“愚蠢”,即具有相当简单(因此通用)的内部表示,并依赖于围绕其构建的工具来执行任何花哨的功能。它还仅设计用于跟踪源代码; 它不设计用于允许您跟踪具有任意权限的任意目录树,因为那将使您陷入一些与跟踪源代码无关的问题的麻烦中(您存储用户和组ID吗?名称?硬链接?xattrs?资源叉等)。

其中一部分愚蠢之处在于仅跟踪文件的内容。它确实存储了一些元数据,这对于在Unix环境下处理源代码至关重要:符号链接和可执行位。有足够多的人们签入的脚本需要跟踪可执行位,因为否则每个人都必须实现它。但除了这两个元数据之外,Git只会跟踪文件内容及其名称。

如果您有超出此范围的用例,则应创建您自己的Porcelain,包装现有的一个,或使用Git提供的扩展点,例如hooksattributes

如果您想要更丰富的权限和目录跟踪,我建议使用像etckeeper这样的包装器。


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