二、版本库与工作区

Subversion的工作区和版本库是截然分开的,而Git的工作区和版本库是如影随形的。

1.SVN的版本库和工作区是分离的
•Subversion的工作区和版本库物理上分开:Subversion的版本库和工作区是存储在不同路径下,一般是在不同的主机中,Subversion的企业级部署中,版本库在服务器上,只能通过https,http,svn等协议访问,而不能直接被用户接触到。
•Subversion的工作区是一份版本库在某个历史状态下的快照,如:版本库最新的数据检出到工作区。
•Subversion的工作区中每一个目录下都包含一个名为.svn的控制目录(隐藏的目录),该目录的作用是:
①标识工作区和版本库的对应关系。
②包含一份该子目录下检出文件的原始拷贝。当文件改动的差异比较或者本地改动的回退时,可以直接参考原始拷贝而无须通过网络访问远程版本库。
•Subversion的.svn控制目录会引入很多麻烦:
①.svn下的文件原始考本,会导致在目录下按照文件内容搜索时,多出一倍的搜索时间和搜索结果。
②.svn很容易在集成时,引入产品中,尤其是Web应用,将.svn目录带入Web服务器会导致安全隐患。因为一个不允许目录浏览的Web目录,可以通过.svn/entries文件查看到该目录下可能存在的文件。

2.Git的版本库和工作区如影随形

•Git的版本库和工作区在同一个目录下,工作区的根目录有一个.git的子目录,这个名为.git的目录就是版本库本身,它是Git用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。所以千万要小心删除这个文件。•工作区中其他文件为工作区文件,可能是从.git中检出的,或者是要检入的,或者是运行产生的临时文件等。

•版本库可以脱离工作区而存在,成为bare(赤裸)版本库。可以用–bare参数来创建。但是工作区不能脱离版本库而存在,即工作区的根目录下必须有一个名为.git的版本库克隆文件。•Git的版本库因为就在工作区中,能直接被用户接触到。①用户可以编辑.git/config文件,修改配置,增添新的源②用户可以编辑.git/info/exclude文件,创建本地忽略…

•Git的工作区中只在工作区的根目录下有一个.git目录,此外再无任何控制目录。Git工作区下唯一的.git目录是版本库,并非.svn的等价物,如果删除了.git目录,而又没有该版本库的其他镜像(克隆)的话,你破坏了整个历史,版本库也永远的失去了。•Git在本地的.git版本库,提供了完全的改动历史。除了和其他人数据交换外,任何版本库相关的操作都在本地完成,更多的本地操作,避免了冗长的网络延迟,大大节省了时间。例如:查看log,切换到任何历史版本等操作都无须连接网络。

•Git如何保证安全:本地创建一个Git库,因为工作区和库是在同一个目录中,如果工作区删除了,或者所在的磁盘分区格式化了,数据不是全都没有了么?其实我们可以这样做:

①在一个磁盘分区中创建版本库(最好是用–bare参数创建),然后在另外的磁盘分区中克隆一个新的作为工作区。在工作区的提交要不时的PUSH到另外分区的版本库,这样就实现了本地的数据镜像。你甚至可以在本地创建更多的版本库镜像,安全性要比Subversion的一个库加上一个工作区安全。

②另一个办法:把你的版本库共享给他人,当他人克隆了你的版本库时,你就拥有了一个异地备份。