Subversion是否允许空文件夹,而Git不允许?

3
大量的谷歌搜索令人惊讶地没有找到明确的参考资料说明Subversion是否允许空文件夹。广泛的测试似乎表明,Git不允许空文件夹,而Subversion允许空文件夹。是否有人能提供一个明确的答案或参考文献:如果Git不允许空文件夹是否属实?是否有人能提供一个明确的答案或参考文献:如果Subversion允许空文件夹是否属实。(例如,Subversion书籍在空文件夹方面实际上没有任何说明,尽管这似乎是一个重要问题!)

2
明白了。但要找到正面的证据来证明它[在SVN中跟踪文件夹]并不容易,主要是因为任何尝试过SVN或查看过教程的人都知道这是可能的。这里有一个简单的技巧:进入任何SVN存储库,创建一个空文件夹并尝试添加它。如果成功了,SVN可以添加空文件夹;如果失败了,则不能。 (这被称为“尝试并查看”方法,通常比其他人告诉你更容易记住东西;)) - Nevik Rehnel
嗨@eis...确实,只是为了明确。这个问题的整个重点 - 整个存在的理由 - 就在于(令人惊讶的)似乎没有任何参考资料明确说明是否允许空文件夹(非常令人惊讶)。问题的整个重点 - 如此反复提到的 - 是“在我搜索了几个小时后,令人惊讶地发现没有关于这个问题的任何信息,能否请专家发表意见。” - Fattie
3个回答

6

正如我在这个答案中所解释的:

  • SVN是一个版本控制系统(它将文件和目录作为版本的一部分存储,即“文件系统树的状态”(包括文件和目录),以便计算增量。
    (这意味着,是的,空目录是允许的,因为它们需要用于计算与未来版本的增量)。

revision in svn

  • Git在其核心是一个内容跟踪器(最初是为管理Linus Torvalds必须合并到他的Linux树中的数百个补丁而构建的)。
    它仅跟踪快照中的内容,以比较表示该内容的SHA1(这是一种非常快速的检查两个内容是否相同的方法)。

git snapshot

由于空目录没有内容,因此它不是快照的一部分。
请注意,这是一个实现问题,而不是基本的git存储设计问题。
有关更多信息,请参见“Git Book”。


@Von,有一个好奇的问题。您已经出色地解释了为什么Subversion实际上允许空文件夹。因此,对于问题“我需要一个专家决定性地回答:Subversion是否允许空文件夹?” 您已经完全回答了:“是的。”(谢谢!)但是,只是出于好奇:你会发现在互联网上无法找到这些信息,这有点奇怪。由于这是如此根本的一点,您会认为会有数百篇文章和文档条目,都提到“当然,svn可以使用空文件夹,而git则没有空文件夹。” 奇怪! - Fattie
@JoeBlow,这主要是因为自从人类诞生以来(主要是在1982年的RCS),版本控制就一直是这样做的方式。但Linus想要一个更快的东西(http://www.youtube.com/watch?v=4XpnKHJAok8&t=10m48s,请等到11'52)。通过SHA1进行内容管理和本地内容比较比任何其他*集中式*(即需要返回服务器)解决方案都要快得多。 - VonC
非常好的观点,再次感谢Von。现在你解释了,这是版本控制通常有很多“假设”等等的有趣例子 - 就像你所说的因为它“最初”是一个历史悠久的领域。例如,“今天的年轻人”只是对能够在没有带宽的情况下本地工作的这些问题感到困惑。干杯。 - Fattie
@JoeBlow 是的,但这种本地工作能力并不源于缓慢的WAN。它源于任何远程访问都会降低性能。而Linus追求的正是性能(以及可靠性)。 - VonC

3
Git Wiki得知,Git索引(暂存区)的设计只允许列出文件,并且还没有足够有能力的人关注到这个问题并进行改进,使空目录也可添加。
Subversion book了解到,svn add可以将工作副本中的文件、目录或符号链接安排加入版本库。

嘿Oli - 非常感谢,但当我在搜索时偶然发现(后者)时,它并不清楚它是否意味着空目录。(例如:有成千上万的网页引用说“您可以将目录添加到git”-明白我的意思吗?因此,假设您不能将空目录添加到子版本控制,则此句话“计划将文件、目录或符号链接添加到您的工作副本中。”仍然是完全正确的,实际上命令“svn add”仍将存在并起作用(但在空目录之后会出现错误)。 - Fattie
@JoeBlow:在SVN中,目录是一种一等实体,而不像Git那样。通过更多的谷歌搜索,我相信可以找到一个明确说明空目录的来源。但是考虑到可以轻松地设置一个SVN仓库并确认这种行为,我不确定是否值得这样做... - Oliver Charlesworth
@JoeBlow:我不会把自己归为“源代码控制专家” ;) 只是一个相当熟悉使用SVN(Git则不太熟悉...)的人。 - Oliver Charlesworth

-1
顺便说一下,如果你想在你的检出中创建空文件夹,你可以使用子模块来实现:
j8=00000001
git update-index --add --cacheinfo 160000,$j8$j8$j8$j8$j8,path/to/emptydir

j8的花招只是获取正确位数的简单方法。唯一重要的部分是40位ID,而不是所有的零。Checkout会创建一个空的子目录,为其克隆子模块或其他管理方式做好准备。


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