这里的关键词是为什么。有很多问题的答案是," git不允许这样做"但我想知道为什么它不允许这样做。
我一直在阅读有关the architecture of git的文章,其中包含以下图片:
此图显示是 tree
个节点。从技术上讲,看起来它可以直接保存tree
而没有任何孩子。那为什么git禁止这个?
本书中有一部分提到了这一点:
对于更改文件上方的每个目录(以及存储库根目录),将使用新标识符创建新树对象。 从新创建的指向blob的根树对象开始创建DAG(重用现有blob引用,其中文件内容在此提交中未更改)并引用新创建的blob代替该文件以前的前一个树层次结构中的blob对象。 (blob表示存储在存储库中的文件。)
我觉得这可能是原因所在,但它可以根据我想要回答的细节来掩饰细节。
答案 0 :(得分:4)
GIT常见问题非常简单:
目前Git索引(临时区域)的设计仅允许 要列出的文件,没有人能够进行更改 允许空目录已经足够关注这种情况了 补救它。
链接:
https://git.wiki.kernel.org/index.php/GitFaq#Can_I_add_empty_directories.3F
答案 1 :(得分:3)
原因实际上很简单 - git index 中的目录只作为文件路径的一部分存在。
换句话说,如果您有目录dir1
和dir2
,其中dir1
包含fileA
,fileB
和dir2
包含{{ 1}},git将提交以下内容(即将以下内容添加到索引文件中):
fileC
dir1/fileA
dir1/fileB
换句话说,dir2/fileC
和dir1
都没有真正提交,它们只是根据其中包含的文件路径隐式构造。
现在是否有更深层次的原因,或者只是简化了实施,我不知道。
答案 2 :(得分:3)
实际上完全可以使用低级命令git mktree
和git commit-tree
来创建和提交外部目录(git ls-tree
对于检查很有用)。我认为这对于镜像支持空目录的其他VCS非常有用。它只是不支持它的高级命令。