首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

JGit源码研习(一)——git ObjectDirectory的结构

2012-09-23 
JGit源码研读(一)——git ObjectDirectory的结构Git是一个有趣的版本控制,git的一些初步知识可以参照http://

JGit源码研读(一)——git ObjectDirectory的结构
   Git是一个有趣的版本控制,git的一些初步知识可以参照http://www.open-open.com/lib/view/open1328069609436.html


   Git的java版是jgit,具体实现是egit,是eclipse的一个插件,但是jgit是一个纯粹的用java实现的Git,具体网址参考http://www.eclipse.org/jgit

   Git这么强大,究竟强大在何处.

   按照本人的理解,git存储是依靠一个叫做\.git\objects\ 的目录,在objects下面,存储了每次发生了变化的文件,然后git通过\.git\index 这个文件来索引那些发生了变化又被记录下来的文件.


   git的原则是,只要加入了版本控制的文件发生了任何变化,都会在objects这个目录中做一个快照,说白了就是复制一份当前版本的文件,然后通过索引控制这个文件是属于哪个版本的.
   也就是这个原因,对一个大文件多次修改提交版本,会造成\.git目录越来越庞大.

   不过git在保存文件的时候也做了一些压缩的操作.

查看jgit中这个类:org.eclipse.jgit.storage.file.ObjectDirectoryInserter
如下:

public ObjectId insert(int type, byte[] data, int off, int len)throws IOException {ObjectId id = idFor(type, data, off, len);if (db.has(id)) {return id;} else {File tmp = toTemp(type, data, off, len);return insertOneObject(tmp, id);}}


最后把这个临时文件压入db中,也就是文件系统,objects目录下。



另外,/.git目录下面还有个index文件,这个文件记录是索引objects中已经存在的文件,把我们真正被跟踪的文件与存放在objects目录中的文件链接起来(被跟踪的文件路径-objects中的sha-1文件名)



/.git目录下有个 HEAD文件,内容是告诉git当前指向哪个分支,\.git\refs\heads\ 目录里面的文件就是各个分支,以及他的sha-1码,这个sha-1会与objects中一个文件相对应.在每产生一个版本,例如:commit这些操作都会引起\.git\refs\heads\   HEAD所指的分支的内容改变.也会产生一个新的sha-1名字的文件在objects中,这将会在我第二篇关于git文章进行详细的分析.
checkout和switch bracnch的操作都会引起HEAD的内容改变.


\.git\logs\refs\heads\中的内容是记录版本的记录,以方便回滚版本,这里的记录都是每\.git\refs\heads\个分支文件的sha-1改变记录.




热点排行