为什么我不能在git中提交一个空文件夹?

时间:2014-09-27 22:03:46

标签: git

这里的关键词是为什么。有很多问题的答案是," git不允许这样做"但我想知道为什么它不允许这样做。

我一直在阅读有关the architecture of git的文章,其中包含以下图片:

DAG with tree nodes

此图显示 tree个节点。从技术上讲,看起来它可以直接保存tree而没有任何孩子。那为什么git禁止这个?

本书中有一部分提到了这一点:

  

对于更改文件上方的每个目录(以及存储库根目录),将使用新标识符创建新树对象。 从新创建的指向blob的根树对象开始创建DAG(重用现有blob引用,其中文件内容在此提交中未更改)并引用新创建的blob代替该文件以前的前一个树层次结构中的blob对象。 (blob表示存储在存储库中的文件。)

我觉得这可能是原因所在,但它可以根据我想要回答的细节来掩饰细节。

3 个答案:

答案 0 :(得分:4)

GIT常见问题非常简单:

  

目前Git索引(临时区域)的设计仅允许   要列出的文件,没有人能够进行更改   允许空目录已经足够关注这种情况了   补救它。

链接:

https://git.wiki.kernel.org/index.php/GitFaq#Can_I_add_empty_directories.3F

答案 1 :(得分:3)

原因实际上很简单 - git index 中的目录只作为文件路径的一部分存在。

换句话说,如果您有目录dir1dir2,其中dir1包含fileAfileBdir2包含{{ 1}},git将提交以下内容(即将以下内容添加到索引文件中):

  • fileC
  • dir1/fileA
  • dir1/fileB

换句话说,dir2/fileCdir1都没有真正提交,它们只是根据其中包含的文件路径隐式构造。

现在是否有更深层次的原因,或者只是简化了实施,我不知道。

答案 2 :(得分:3)

实际上完全可以使用低级命令git mktreegit commit-tree来创建和提交外部目录(git ls-tree对于检查很有用)。我认为这对于镜像支持空目录的其他VCS非常有用。它只是不支持它的高级命令。