jGit常用使用介绍
JGitProGitv2中文版UDN开源文档(yonyoucloud。com)
地址:http:doc。yonyoucloud。comdocwikiprojectprogittwojgit。htmlJgit基础教程(Java调用git)前言
最近公司需要做一个java调用git的工具,这里简单的介绍了一下基本操作方法以及一些衍生的信息获取,或有不对的地方请大家批评指正。转载请注明出处。一、Jgit依赖导入dependencygroupIdorg。eclipse。jgitgroupIdorg。eclipse。jgitartifactIdversion4。4。1。201607150455rversiondependencydependencygroupIdorg。eclipse。jgitgroupIdorg。eclipse。jgit。archiveartifactIdversion5。8。1。202007141445rversiondependency二、Jgit获取Git操作对象
获取Git对象是一切git操作的基础,笔者写了一个方法封装了一下。importorg。eclipse。jgit。api。Git;importorg。eclipse。jgit。lib。Repository;publicclassJGitUtils{publicstaticGitopenRpo(Stringdir){Gitgitnull;try{RepositoryrepositorynewFileRepositoryBuilder()。setGitDir(Paths。get(dir,。git)。toFile())。build();gitnewGit(repository);}catch(IOExceptione){e。printStackTrace();}returngit;}}三、基础操作(Base)1。打开仓库(open)git命令:
gitBashHereJgit代码:GitgitjGitUtils。openRpo(localPath);获取git对象System。out。println(git);参数:StringlocalPathC:Usersyang。yangDesktoptest;本地仓库位置结果:
2。初始化(init)git命令:
gitinitJgit代码:GitgitGit。init()。setDirectory(newFile(localPath))。call();System。out。println(git);参数:StringlocalPathC:Usersyang。yangDesktoptest1;本地仓库位置结果:
3。添加到暂存区(Add)git命令:
gitadd。
gitaddDelete。txt
gitaddModify。txt
gitaddFolderInFolder。txtJgit代码:git。add()。addFilepattern(。)。call();添加全部文件git。add()。addFilepattern(New。txt)。call();git。add()。addFilepattern(Delete。txt)。call();git。add()。addFilepattern(Modify。txt)。call();git。add()。addFilepattern(FolderInFolder。txt)。call();git。rm()。addFilepattern(Delete。txt)。call();备注:
删除和移动的文件不能使用git。add(),需要使用git。rm()的方式,就算参数是。也需要使用git。rm()方法结果:
4。提交(Commit)git命令:
gitcommitmfirstcommitJgit代码:git。commit()。setMessage(firstcommit)。call();结果:
5。状态(status)git命令:
gitstatusJgit代码:MapString,StringmapnewHashMapString,String();GitgitjGitUtils。openRpo(localPath);Statusstatusgit。status()。call();map。put(Added,status。getAdded()。toString());map。put(Changed,status。getChanged()。toString());map。put(Conflicting,status。getConflicting()。toString());map。put(ConflictingStageState,status。getConflictingStageState()。toString());map。put(IgnoredNotInIndex,status。getIgnoredNotInIndex()。toString());map。put(Missing,status。getMissing()。toString());map。put(Modified,status。getModified()。toString());map。put(Removed,status。getRemoved()。toString());map。put(UntrackedFiles,status。getUntracked()。toString());map。put(UntrackedFolders,status。getUntrackedFolders()。toString());System。out。println(map);备注:
里面记录的我目前已经知道的属性,得到的结果是文件名,还有其他的属性可以自行研究。结果:
四、分支操作(Branch)1。创建分支(CreateBranch)git命令:
gitbranchdevJgit代码:git。branchCreate()。setName(dev)创建的分支名字。call();结果:
2。删除分支(DeleteBranch)git命令:
gitbranchddevJgit代码:git。branchDelete()。setBranchNames(dev)设置删除分支的名字。call();结果:
3。切换分支(CheckoutBranch)git命令:
gitcheckoutdevJgit代码:git。checkout()。setName(dev)设置分支名。call();结果:
4。所有分支(BranchList)git命令:
gitbranchJgit代码:ListRefcallgit。branchList()。call();得到所有分支信息for(Refref:call)System。out。println(ref);备注:
得到的信息是所有内容,可以用函数处理,例如ref。getName()可得到名字相关内容结果:
5。合并分支(MergeBranch)git命令:
在master分支上使用gitmergedevJgit代码:Refrefdevgit。checkout()。setName(dev)。call();切换分支获取分支信息存入Ref对象里git。checkout()。setName(master)。call();切换回master分支MergeResultmergeResultgit。merge()。include(refdev)合并目标分支。setCommit(true)同时提交。setFastForward(MergeCommand。FastForwardMode。NOFF)分支合并策略NOFF代表普通合并。setMessage(masterMergedev)设置提交信息FF代表快速合并。call();备注:
合并操作是一项危险的操作,我只是做了一个简单尝试,更多的功能还需要自行研究。结果:
五、远端仓库操作(Repository)1。推送(Push)git命令:
gitpushoriginmasterJgit代码:CredentialsProviderprovidernewUsernamePasswordCredentialsProvider(userName,password);生成身份信息git。push()。setRemote(origin)设置推送的URL名称。setRefSpecs(newRefSpec(branch))设置需要推送的分支,如果远端没有则创建。setCredentialsProvider(provider)身份验证。call();备注:
这种推送需要在已经设置remote的情况下进行。结果
之前提交的log
push执行后
2。拉取(Pull)git命令:
gitpulloriginJgit代码:CredentialsProviderprovidernewUsernamePasswordCredentialsProvider(userName,password);生成身份信息git。pull()。setRemoteBranchName(master)设置需要pull的远端分支。setCredentialsProvider(provider)身份验证。call();结果:
3。克隆(Clone)git命令:
gitclonehttp:admin10。179。2。14:10101rTesttest01。gitJgit代码:克隆CredentialsProviderprovidernewUsernamePasswordCredentialsProvider(userName,password);生成身份信息FilelocalpathnewFile(localPath);GitgitGit。cloneRepository()。setURI(remotePath)设置git远端URL。setDirectory(localpath)设置本地仓库位置。setCredentialsProvider(provider)设置身份验证。setCloneSubmodules(true)设置是否克隆子仓库。setBranch(branch)设置克隆分支。call();启动命令git。getRepository()。close();git。close();关闭源,以释放本地仓库锁参数:StringlocalPathC:Usersyang。yangDesktoptest;本地仓库位置StringremotePathhttp:admin10。179。2。14:10101rTesttest01。git;远端仓库URLStringbranchmaster;克隆目标分支StringuserNameadmin;远端仓库用户名Stringpasswordadmin;远端仓库密码密码结果:
4。设置远程连接(SetRemote)git命令:
gitremotemasterhttp:admin10。179。2。14:10101rTesttest01。gitJgit代码:git。remoteAdd()。setName(master)设置remote名字。setUri(newURIish(http:admin10。179。2。14:10101rTesttest01。git))设置url。call();结果:
5。删除远程连接(Removeremote)git命令:
gitremotermmasterJgit代码:git。remoteRemove()。setRemoteName(master)。call();结果:
6。获取所有远程连接(AllRemote)git命令:
gitremotevJgit代码:MapString,StringurlMapnewHashMap();ListRemoteConfigremoteConfigListgit。remoteList()获取list。call();for(RemoteConfigx:remoteConfigList){urlMap。put(x。getName(),x。getURIs()。toString());获取名字,获取URL}System。out。println(urlMap);结果:
六、标签(Tag)1。创建标签(CreateTag)git命令:
gitaV1。0mtesttag9167dadd48bca196208a4687b5d4706e355c42b6Jgit代码:ObjectIdidgit。getRepository()。resolve(9167dadd48bca196208a4687b5d4706e355c42b6);获取提交的ObjectIDRevWalkwalknewRevWalk(git。getRepository());获取RevWalk对象RevCommitcommitwalk。parseCommit(id);获取该commitID的RevCommit对象git。tag()。setObjectId(commit)设置commit。setName(V1。0)设置tag名字。setMessage(testtag)设置tag注释。setAnnotated()是否为annotate。call();结果:
2。所有标签(AllTag)git命令:
gittagJgit代码:ListRefrefListgit。tagList()。call();获取所有tagRevWalkwalknewRevWalk(git。getRepository());for(Refref:refList){System。out。println(commitID:walk。parseCommit(ref。getObjectId())。getName());通过ref获取objectIDSystem。out。println(tagName:ref。getName());然后通过walk获取commit对象再获取commitId}结果:
3。删除标签(DeleteTag)git命令:
gittagdV1。0Jgit代码:git。tagDelete()。setTags(V1。0)设置tag名。call();结果:
4。将标签推送至远程(PushTag)git命令:Jgit代码:CredentialsProviderprovidernewUsernamePasswordCredentialsProvider(userName,password);生成身份信息git。push()。setRemote(origin)设置remote。setPushTags()pushtag。setCredentialsProvider(provider)。call();备注:
默认是推送当前仓库内所有tag,单个推送目前没找到方法,得自行研究。结果:
七、差异对比(Diff)1。两个版本之间的对比(BetweentwoCommit)git命令:
gitdiffHEADHEADJgit代码:ByteArrayOutputStreamoutputStreamnewByteArrayOutputStream();AbstractTreeIteratornewTreeIterprepareTreeParser(git。getRepository(),git。getRepository()。resolve(HEAD)。getName());AbstractTreeIteratoroldTreeIterprepareTreeParser(git。getRepository(),git。getRepository()。resolve(HEAD)。getName());git。diff()。setNewTree(newTreeIter)设置源,不设置则默认工作区和历史最新commit版本比较。setOldTree(oldTreeIter)。setPathFilter(PathFilter。create(。txt))设置过滤。setOutputStream(outputStream)输出流用outputStream,后面转成字符串。call();System。out。println(outputStream。toString());publicstaticAbstractTreeIteratorprepareTreeParser(Repositoryrepository,StringobjectId)throwsIOException{try(RevWalkwalknewRevWalk(repository)){RevCommitcommitwalk。parseCommit(ObjectId。fromString(objectId));RevTreetreewalk。parseTree(commit。getTree()。getId());CanonicalTreeParsertreeParsernewCanonicalTreeParser();try(ObjectReaderreaderrepository。newObjectReader()){treeParser。reset(reader,tree。getId());}walk。dispose();returntreeParser;}}备注:
prepareTreeParser是一个把RevCommit对象转换成AbstractTreeIterator方法,Jgit中的Tree和Ref是存储git对象的类,具体作用请阅读文尾的官方文档。
当diff()方法中不指定NewTree和OldTree时,默认比较工作区和当前分支最后一次commit的区别。结果:
2。当前暂存区与最后一次提交之间的对比(Currentstagingareaandlastcommit)git命令:
gitdiffJgit代码:git。diff()。setOutputStream(outputStream)输出流用outputStream,后面转成字符串。call();System。out。println(outputStream。toString());结果:
八、回溯(ResetRevert)1。Resetgit命令:
gitresetJgit代码:RevWalkwalknewRevWalk(git。getRepository());获取walk对象ObjectIdobjectIdgit。getRepository()。resolve(9167dadd48bca196208a4687b5d4706e355c42b6);ObjectId对象RevCommitrevCommitwalk。parseCommit(objectId);获取Revcommit对象StringperVisionrevCommit。getParent(0)。getName();获取commit的身份名git。reset()。setMode(ResetCommand。ResetType。HARD)。setRef(perVision)。call();设置参数结果:
2。Revertgit命令:
gitrevertJgit代码:RevWalkwalknewRevWalk(git。getRepository());RevCommitrevCommitwalk。parseCommit(ObjectId。fromString(commitid));git。revert()。include(revCommit)。call();结果:
备注:
Reset和Revert结果比较复杂,演示的只是一个可行的方法,具体应用请查看文尾的官方文档。九、参考链接
参考文档:https:github。comcentic9jgitcookbook
官方文档:http:archive。eclipse。orgjgitsite5。3。0。201903130848rapidocsindex。html
那些冬天不涂防晒的人最后都黑成什么样了?进入冬季后,大家一边忙着维稳一边为缓解皮肤的干燥操碎了心,却忘记了另一个护肤重点!少有的艳阳天和寒冷的温度免不了给人一种错觉冬天感觉不到晒了,也就不用涂防晒了。一年四季都要对抗紫外
绝了,毛衣半裙竟有这么多讲究,参考这些搭配,比想象好看秋冬季节,只要说到毛衣两个字,就仿佛已经能够感受到它的带来的暖意和安全感。所以,在这份暖意的包裹下,在冷冷的季节里,我们也能放心地穿上裙子。毛衣半裙,兼顾了温暖踏实与飘逸浪漫,其实
文案你逢人就炫耀的玫瑰枯萎时要怎么收场在谷底也要开花,在海底也要望月现在天色暗了我也倦了要是你拉了别人的手,你就不是我的英雄了我步步回头却找不到停下的理由愿许秋风知我意,散我心中意难平,祝相逢的人不会走散。走散的人再也
上头太快的那个人也只是我们的工具人friends我和现在玩的好的朋友,都不是当初一眼定情的,都是长期相处中,把不讨厌变成了有点好奇,有点好奇变成了有点理解,有点理解变成了一起玩好玩,一起玩的过程中再培育出什么理解默
激励自己的一句话,送给大家。时间用来努力上,不管成败都比你空虚的耗日子强的多。。如果一个人仅仅正因你对他好才爱你,不如算了吧,这样的感情多累呀。没有人会因你的自我牺牲而感动一辈子,没有回报的爱,久了都会怨气
善其一生所谓人心,关键是人心需要如何写。奥斯特洛夫斯基曾经说过,共同的事业,共同的斗争,可以使人们产生忍受一切的力量。这不禁令我深思。带着这句话,我们还要更加慎重的审视这个问题了解清楚人心
不能试探的人性日本东野圭吾说过世上有两样东西不能直视,一是太阳二是人心。直视太阳会灼伤视网膜,直视人性会伤心。这句话告诉你,人性的弱点,经不起拆穿,永远不要去试探人性,结果会令你绝望。人是以群居
层次越高的人,越不需要面子生活中,我们经常可以看到好面子的人,甚至为了所谓的面子,折了里子,一味地追求表面的富丽堂皇,却忘记提升内在的充盈,这本身是一件舍本逐末的事情。学会把面子放下,寻求内心的充实,才是生
自己的独角戏是谁导演这场戏,在孤独的角色里,对白总是自言自语,对手都是回忆,看不出什么结局!独角戏听到这首歌独角戏,竟然泪眼朦胧。好似风中的雨,流淌自己的心事,叹息着谁会懂,心中有千言万语,就
田螺时代我小时候,故乡汝阳县城南河滩一带的河里沟渠里都有田螺的影子。不过我们那儿的人家大都不吃田螺,觉着那东西只有穷人家才吃,也就是说谁家吃田螺就表明谁家穷,会被鄙视的。也有人家去河滩拾一
红米K50至尊版使用体验,给双11前犹豫的你红米K50至尊版发布至今已有近3个月的时间,作为一名这款手机刚发布不久就入手的用户,这几个月的使用体验还是非常不错的,我是买的8256G的版本,颜色是银迹,颜值方面还是很耐看的,有