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);}}