JGit新手指南-编程开发技术_第1页
JGit新手指南-编程开发技术_第2页
JGit新手指南-编程开发技术_第3页
JGit新手指南-编程开发技术_第4页
JGit新手指南-编程开发技术_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、jgit新手指南-编程开发技术jgit新手指南木文由importnewhunter翻译自javacodegeeks0欢迎加入翻译小组。转载请见文末要求。如果你想知道像?git init, ?git checkout?等等的基本git命令是如何在jgit 上运行的话,请往卜看。本教程提供了最常用的git命令以及它们在jgit上对应部分的概述。本教程 将依次介绍:创建一个存储库,从远程获取内容,向丿力史版木中添加和删除文件, 检查历史操作,并最终将更改的文件推回到原始存储库。jgit提供了一个类似于git高级命令的apt,你会在jgit里面的命令行用这 个代码git. commit().setme

2、ssage ( my first commit ) call ();代替git commit -m my first commit所有的?jgit命令?有一个cal 1()方法,在命令被建立之后用來实际执行它。 这些类的命名是在各口的git命令后加上后缀命令。虽然有些命令提供一个公 共构造函数,述是建议使用git的工厂类来创建命令,如在上而的示例屮所示。获取库但是在更深入到jgit apt之前,让我们先得到库。最常见的取得jgit的方法 可能就是从maven仓库中取。但是如杲你更喜欢osgi捆绑,也有p2仓库供 你使用。下载页而?上列出了整合该库的必要信息。对于本文所涉及的范围来说,整合在?p

3、roject/bundle下的?org. eclipse, jgit 核心库已经足够了。如果你对其他jgit的源代码库感兴趣,我推荐阅读jgit 资源介绍创建一个仓库首先,我们需要一个仓库。为了得到一个仓库,我们可以初始化一个新的存储库 或克隆-个现有的。我们可以用tnit命令创建一个新的仓库。下面的语句git git = git. init(). sctdirectory( "/path/to/repo” ).call ();将在setdirectory ()下设置的路径屮创建一个带工作目录的仓库。.git目录将 会直接在?/path/to/repo/. git路径下而。对init

4、命令的详细解释请参阅文章 在jgit中初始化git仓库。git git = gil. cionereposilory().seturi ( https:/githubcom/eclipse/jgitgit") set direc to ry ( ,z/pa th/to/rcpo ) call ();现有的仓库可以用clone命令克隆git git 二 git. clonerepository ().seturt ( “ sctdircctory ( /,/path/to/rcpo,z ).call ();上面的代码将克隆远程jgit仓库到木地目录的路径lepath/to/po,下。所

5、有 clone命令的选项在?如何在jgil中克隆git仓库 中进行了更加详细的解 释。结束时关闭git注意那些会返回实例的命令例如init命令或者clone命令当不 再需要时如果没有明确地关闭(git. closeo )的话,可能会造成 文件句柄泄露。幸运的是,git实现了 autocloseable以便你口j以使用 try-with-rcsourccs 声明。填充仓库现在我们有仓库了,我们可以填充它的力史了。但为了提交文件首先需要将它添 加到所谓的索引(又名临时区)。只有在索引中增加或者删除的文件才会被 commit命令考虑。因此jgit命令就是(你猜一下)add命令。dircache in

6、dex = git.add()addfilepattern( "readmetxt")call ();因此上述代码把readme, txt这个文件加入到了索引中。值得注意的是文件的实 际内容是被复制到了索引。这意味着后来的对这个文件的修改不会被包含在索引 中,除非你再次添加。给addfilcpattcrno的路径必须相对于工作目录的根。如杲一个路径没有指向 一个现冇的文件,它就被忽略了。虽然方法名称表明模式是可以接受的,但是在这里jgit的支持是冇限的。传 一个将在工作目录中添加所有文件。但是java之类的用法是不支持的, 尽管在原生git命令屮可以这么用。通过callo返

7、冋的索引,在?jgit命名为?dircache,通过检查验证了它实际 上包含了我们所期望的东西。它的?getentrycount 0方法返回了文件总数,而 且?getentry()方法反回了指定位置的入口。现在用commit命令把变化存入仓库的准备工作已经一切就绪。revcommit commit 二 git. commit(). setmessage( "create readme file" ). cal 1 ();至少提交消息必须被指定,否则?call ()将会抛出一个?nomcssagcexccption异 常。但是一个空的消息是被允许的。作者和提交者如果没有被相应

8、的标记的方法 指出的话,将会从配置文件中取得。返冋的?revcommit描述了这条?commit的信息作者,提交者,时间戳,当然还 有一个指针指向文件树和构成此提交的目录。新增或者修改的文件需要被增加,同样的删除的文件也需耍被明确地被移除。rm 命令是相对于add命令的,使用方式也是一样(当然是相反的结果)。dircache index 二 git.rm().addfilepattern( readme.).call ();以上的命令会再次的删除指定的文件。因为这是仓库中的唯一的文件,当查询该 条目的编号时,返回的索引值将为0。除非?sctcached被指定为true,文件也会在工作目录被删除

9、。因为git不会 跟踪目录,rm命令也会删除指定文件的空的父目录。试图删除一个不存在的文件会被忽略掉。但是和add命令不一样的是,rm命 令在addfilepatterno命令中不接受通配符。任何要被删除的文件需要被单独 指定。这些改变将会与下一个提交一起被存储在仓库中。请注意,创建一个空的提交是 完全合法的,例如一个没有文件增加或者删除执行过的仓库。虽然我也没有想到 一个得体的使用情况。仓库的状态状态命令会列岀索引和目前最新的提交之间有差异的文件或者工作目录和索引 之间有差异的文件或者没有被git跟踪到的文件。status命令以其最简单的形式,收集了所冇屈于库文件的状态。status sta

10、tus = gitstatus()call();对象状态的get类方法应该是意义口明的。它们返冋在该方法名描述的状态中 的文件名的集合。例如,如前文所述中在readme, txt文件被增加到索引后, status. getaddedo这个方法会返冋一个包含刚刚添加的文件的路径的集合。如果没有任何茅别,也没有未被跟踪到的文件,那么status. iscleano这个方 法会返回true。而顾名思义,如果冇未捉交的改变的话status. hasuncominittedchanges ()这个方法会返冋 true。status命令可以用addpath()方法来配置为只显示某些文件状态。给定的路径 必

11、须指明一个文件或者目录名。不存在的路径会被忽视,并且正则表达式或通配 符是不被支持的。status status = git.status()addpath( "documentation")call ();在以上的例子屮,在documentation 口录下递归的所有文件的状态将被计算出。探索库现在,该库有一个(小的)历史,我们将查看列出已存在的提交的命令。最简单的git log对应在jgit中的形式允许列出所有的可以从目前的head 屮得到的捉交。iterable iterable = git.log()call();返回的迭代器可以用来循环遍历所有的用log命令找到的

12、提交。对于更高级的使用情况,我建议直接使用revwalkapt,这个同样类也被log命 令所使用。除了提供更大的灵活性,也避免了可能的资源泄漏,因为log命令 内部使用的revwalk是永远不会关闭。例如,它的markstart()方法也可以用来列出可从其他分支得到的提交(或概 括地说,从其他参考)。不幸的是,只有objectld会被接受,因此要求的参考需要首先被解决。在jgit 中的objectld封装了一个指向gits object数据库中的对象的sha-1 hash。在这里,指向提交的objectld是需要的,解决在这里的意思是要得到这个特定 的ref指向的objectld。全部放在一起

13、,看起来像下面的代码段:repository repository 二 git.getrepository() try( revwalk rcvwalk = new revwalk( repository ) ) objectld commitld = repository. resolve( z,refs/heads/side-branch,z ); revwalk. markstart ( revwalk. parsecominit ( commit id );for( revcommit commit : revwalk ) system, out. printin( commi t.

14、getfulimessage );分支的side-branch分支点的提交id被获取,然后revwalk被委派去遍丿力 历史记录。因为markstart ()方法需要rev命令,revwalk的parse命令被 用來将提交id转化为实际提交。当revwalk设置完毕后,上述代码段循环打印出每条提交的信息。 try-with-resource声明确保了 revwalk会在结束后被关闭。需要注意的是, 多次调用markstart()方法来包含多次的参考之间的往返移动是合法的。一个revwalk也可以被设定用来过滤提交,既可以通过匹配提交对象的属性, 也口j以通过匹配它代表的目录树的路径。如果提询知

15、道的话,不感兴趣的提交和 他们的祖先链可以从输出中排除。当然,输出可以进行排序,例如按口期或拓扑 (所冇子类在父类前)。但是这些特性已经在本文的范畴z外,但可能会安排在 将来它自己的文章中。和远程仓库交互本地库经常是从远程库中克隆來的。本地的改变最终应该发布到原始仓库中。为 了完成这一操作,jgit提供了一个push命令.最简单的形式将当前分支推到其相应的远程分支。iterable iterable 二 loca1.push().call ();pushresult pushresul t = i terable. i terator (). next();status status=push

16、resuit. getremotcupdatc( "rcfs/hcads/master" )gctstatus();该命令将返冋一个可迭代的pushresultsc在上述例子中的迭代只有一个元素。 为了验证推送是否成功,pushresult可以被要求返冋一个remoterefupdate给 指定的分支。一个remoterefupdate详细描述了更新了什么和如何更新的。但它同时也包含 了一个状态展性,用以对结果状态进行总结性表述。如果状态返回0k,我们可 以放心的确认操作是成功的。即使命令不给任何建议也能工作,它有很多的选项,以下只列出了最常用的。默 认情况下,该命令推送到

17、了默认的叫做'origin'的远程库。使用setremoteo 指定一个不同的远程存储库的url或名称。如果其他分支比当前分支更应该推 送的话,refspecs可以用setrefspec()来指定。标签是否需要被转移可以用 setpushtagso来控制。最后,如果你不确定结果是否理想,则有一个dry-run 选项,可以模拟一个推送操作。现在,我们己经看到了如何将本地对象传输到远程存储库中,我们将看一下反向 操作如何工作。fetch命令的使用和它相对应的推送命令一样,而且也能用默认 设置操作成功。fetchresult fetchresult = local.fetch().

18、call ();trackingrefupdate refupdate二 fetchresul t. gettrackingrefupdate( refs/remotes/origin/master,z ); result result = refupdategctrcsult();没冇进一步的配置,该命令得到的改变是当前分支所对应的默认远程仓库。fetchresult提供了详细的操作结果的信息。每一个受到影响的分支可以获得一 个tracki ngrefupdate实例。最有趣的可能是getresult ()的返回值对更新操 作的结果进行了总结。此外,它还包括了哪个本地ref (getlocalbameo)和哪 个远程ref (getremotename()更新的信息,述有本地ref在更新前和更新后 (getoldobjectld()和 getnewobjectid()指向的对象 id 的信息。如果远程存储库需要认证,和其他所有和远程库通信的命令一样,push命令和 fetch命令可以同样的方式来准备。详细的讨论口j以在jgit authentication explained这篇文章中找到。jgit新手指南总结现在轮到你来玩转jgit to高级的jgit api不难理解。如果你知道如何使用 git命令,你可以轻松的猜出?jgit中哪个类和方法的使用。虽然不是细

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论