读书人

Jgit研究Git一次Commit所做的事儿

发布时间: 2012-09-22 21:54:54 作者: rapoo

Jgit研究——Git一次Commit所做的事情
git commit的时候首先要判断这个文件 是否已经addIndex了, 判断这个文件的状态是由
jgit中一个叫 indexDiff(以后介绍)的类来判断。

如果文件还没被加入到index中,则记录这个文件,并且在objects目录里面保存一份压缩备份。


然后保存一个 commit树,同样像上面保存文件一样保存到Objects中,这个树文件解压后用ue打开如下图:



上面图片表示这次版本有两个文件,分别是 hello.txt和32222.txt,分别存在objects目录的71/10252d36257b4f497bd6dfbdd4bd55edf7ccf2与f6/1fba897999ff8b9f4bdb2a8f7dd83a239da89b文件中.

然后还生成了一个commit文件,内容如下:
commit 218 tree d9988ff3d7205f743ca5d8fc42066fbe76e03649
parent 92cf2c1197628e2da6925a93ca96d582e78874b8
author db2admin <db2admin@20101222-1851> 1346729845 +0800
committer db2admin <db2admin@20101222-1851> 1346729845 +0800

wawa


每一行分别指:
1.指本次commit的commit树存放的位置,也就是上面图片所显示的内容;
2.上一次commit的commit树;
3.坐着;
4.commit者;
5.注释.


这些commit的记录就放在.git\logs\目录下.



上面查看objects/ 目录下面的任何文件都需要解压, 加压程序如下:

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.security.DigestInputStream;import java.util.zip.Inflater;import java.util.zip.InflaterInputStream;import org.eclipse.jgit.lib.Constants;public class 解压 {public static void main(String[] args) throws IOException {inflater();}public static void inflater() throws IOException {FileInputStream fis = new FileInputStream(new File(//objects 中的文件名// "D:\\testGit\\.git\\objects\\ca\\62802ccb8d116602d0b4329ffe4a7a6eb7ed86"));"D:\\testGit\\.git\\objects\\3a\\7ac4fb195ee69590d0d8d7f7ba306d522c19d4"));DigestInputStream din = new DigestInputStream(fis,Constants.newMessageDigest());Inflater inflate = new Inflater();InflaterInputStream inis = new InflaterInputStream(din);//要保存查看的文件位置FileOutputStream fos = new FileOutputStream(new File("z:\\xxxx.txt"));byte[] bytes = new byte[1024];while (inis.read(bytes) >= 0) {fos.write(bytes);}}}





作者:http://414149609.iteye.com/admin/blogs/1672183

读书人网 >开源软件

热点推荐