读书人

JGit源码研习(一)git ObjectDirec

发布时间: 2012-09-23 10:28:11 作者: rapoo

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改变记录.




读书人网 >开源软件

热点推荐