2011-11-13 302 views
1

我将很快开发许多iPhone/iPad应用程序,并正在使用Git作为我的版本控制系统。在过去的项目(但不是基于iOS)我已经使用SVN。我转向Git的主要决定是分散结构。Git远程服务器存储库文件存储

我将使用远程服务器作为中央Git存储库(很可能是Atlassian的bitbucket)。我还没有设置这个,但同时我一直在本地测试Git。

我已经阅读了一些初学者资源,现在已经掌握了一些基础知识,但有一点我需要确认我理解正确。

在我的例子中,我在我的Mac上使用本地版本的Git。

我创建了一个名为git_test的本地git存储库。在这个仓库中,我有两个虚拟文件,称为file1file2。我明白,这是我的工作目录,其中包含我的实际文件(而不是斑点)。

我也明白,远程服务器上的中央存储库应该是裸露的,并且不包含工作目录的实际文件。

我们假设我有两个用户(用户A和用户B)拥有相同的本地存储库。

用户A

  • :修改file1的
  • 提交file1的
  • 执行一个推到远程存储库

用户B

  • :修改文件2
  • 提交文件2
  • 执行推到远程存储库

我是在说,新的斑点被上传到git的纠正/对象远程存储库中的目录?

然后,当用户A和用户B在他们的本地系统上执行pull命令时,实际文件而不是blob被更新为新blob的内容。它是否正确?

对不起,这个冗长的问题。我只是希望一切都有道理。

回答

0

您不必太担心裸仓库中的斑点。最好理解的是,每个存储库都由提交对象时包含确切的文件结构的提交对象组成。

在你的例子中,用户A在本地生成一个commitA,用户B在本地生成commitB,他们都是在裸仓库的master上创建的,它会指向一个提交对象(比如说)commitBase。这意味着它们都有一个commitBase的父类。

当A推时,他将他的commitA推送到裸仓库,它将主分支指针移动到commitA。所有关于file1的信息都在提交对象commitA中(以及关于文件结构其余部分的信息)。

在B推之前,他必须首先将commitA的更改提交到他的回购库中,因为远程主分支指针不再指向commitBase。直到他与提交对象和分支指针上的远程同步后才能推送。因此,当他将commitA对象放入其回购库时,他将获得fileA作为其中的一部分,如果他执行了pull或rebase,它将出现在他的文件系统中,但只会将commit对象存入他的存储库(而不是文件他的工作目录),如果他做了抓取。取指令只是在内部用新的提交对象更新git而不改变你自己的主分支指针。在合并/重新定义的时候,git将不得不对工作目录中的文件做出一些决定,例如,如果通用文件可以轻松合并,或者新文件可以放在磁盘上,或者如果文件太大冲突,你将不得不手动解决文件中的冲突。

在你的简单例子中,你没有冲突,所以你要么rebase并让你的commitA成为commitA2并且有一个commitB的父类,或者合并你的commitA对象的父类作为commitBase,但是生成一个新的commitM对象是合并B和A的结果。

git在它的.git/objects目录中如何内部表示这3个存储库中的任何目录都是不相关的。它可能会压缩和移动东西,以尽可能最大化其所有对象的数据库,但它并不是我曾经为了解提交对象到文件如何工作而担心的事情。

+0

非常非常感谢。很好的解释。 – mdim

0

当你推到远程回购它将如果回答您的问题否认这一点,如果你的本地回购的背后是远程回购

不知道

这可以确保你不要试图改变文件已经改变 - 它迫使你事先拉最新的变化

当你拉到你的本地回购是实际的文件变化 - 在git回购我相信它创建一个新的差异文件iirc,但我可以错误,我所知道的是它并不实际覆盖远程文件

+0

非常感谢,这澄清了我的困惑。 – mdim

+0

如果@DanZimm已回答您的问题,请您考虑将答复标记为正确答案? –