范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

jGit常用使用介绍

  JGit - Pro Git v2 中文版 - UDN开源文档 (yonyoucloud.com)
  地址: http://doc.yonyoucloud.com/doc/wiki/project/pro-git-two/jgit.htmlJgit基础教程(Java调用git)前言
  最近公司需要做一个java调用git的工具,这里简单的介绍了一下基本操作方法以及一些衍生的信息获取,或有不对的地方请大家批评指正。转载请注明出处。  一、Jgit依赖导入       org.eclipse.jgit       org.eclipse.jgit       4.4.1.201607150455-r                  org.eclipse.jgit       org.eclipse.jgit.archive       5.8.1.202007141445-r      二、Jgit获取Git操作对象
  获取Git对象是一切git操作的基础,笔者写了一个方法封装了一下。  import org.eclipse.jgit.api.Git; import org.eclipse.jgit.lib.Repository; public class JGitUtils { public static Git openRpo(String dir){         Git git = null;         try {             Repository repository = new FileRepositoryBuilder()                     .setGitDir(Paths.get(dir, ".git").toFile())                     .build();             git = new Git(repository);         } catch (IOException e) {             e.printStackTrace();         }         return git;     } } 三、基础操作(Base)1.打开仓库(open)git命令:
  git Bash Here  Jgit代码:   Git git = jGitUtils.openRpo(localPath); //获取git对象    System.out.println(git); 参数:  String localPath = "C:Usersyang.yangDesktoptest";    //本地仓库位置 结果:
  2.初始化(init)git命令:
  git init  Jgit代码:Git git = Git.init().setDirectory(new File(localPath)).call(); System.out.println(git); 参数:String localPath = "C:Usersyang.yangDesktoptest1";    //本地仓库位置 结果:
  3.添加到暂存区(Add)git命令:
  git add .
  git add Delete.txt
  git add Modify.txt
  git add Folder/InFolder.txt  Jgit代码: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("Folder/InFolder.txt").call(); git.rm().addFilepattern("Delete.txt").call(); 备注:
  删除和移动的文件不能使用git.add(),需要使用git.rm()的方式,就算参数是"."也需要使用 git.rm()方法  结果:
  4.提交(Commit)git命令:
  git commit -m"first commit"  Jgit代码:git.commit().setMessage("first commit").call(); 结果:
  5.状态(status)git命令:
  git status  Jgit代码:Map map = new HashMap(); Git git = jGitUtils.openRpo(localPath);     Status status = git.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.创建分支(Create Branch)git命令:
  git branch dev  Jgit代码:git.branchCreate()         .setName("dev") //创建的分支名字         .call();   结果:
  2.删除分支(Delete Branch)git命令:
  git branch -d dev  Jgit代码:git.branchDelete()         .setBranchNames("dev")   //设置删除分支的名字         .call(); 结果:
  3.切换分支(Checkout Branch)git命令:
  git checkout dev  Jgit代码:git.checkout()         .setName("dev") //设置分支名         .call(); 结果:
  4.所有分支(BranchList)git命令:
  git branch  Jgit代码:List call = git.branchList().call();     //得到所有分支信息 for(Ref ref : call)     System.out.println(ref); 备注:
  得到的信息是所有内容,可以用函数处理,例如ref.getName()可得到名字相关内容  结果:
  5.合并分支(Merge Branch)git命令:
  在master分支上使用 git merge dev  Jgit代码:Ref refdev = git.checkout().setName("dev").call(); //切换分支获取分支信息存入Ref对象里 git.checkout().setName("master").call();   //切换回master分支 MergeResult mergeResult = git.merge().include(refdev)  // 合并目标分支         .setCommit(true)           //同时提交         .setFastForward(MergeCommand.FastForwardMode.NO_FF)// 分支合并策略NO_FF代表普通合并         .setMessage("master Merge dev")     //设置提交信息   //  FF代表快速合并         .call(); 备注:
  合并操作是一项危险的操作,我只是做了一个简单尝试,更多的功能还需要自行研究。  结果:
  五、远端仓库操作(Repository)1.推送(Push)git命令:
  git push origin master  Jgit代码:CredentialsProvider provider = new UsernamePasswordCredentialsProvider(userName, password);  //生成身份信息 git.push()         .setRemote("origin")    //设置推送的URL名称         .setRefSpecs(new RefSpec(branch))   //设置需要推送的分支,如果远端没有则创建         .setCredentialsProvider(provider)   //身份验证         .call(); 备注:
  这种推送需要在已经设置remote的情况下进行。  结果
  之前提交的log
  push执行后
  2.拉取(Pull)git命令:
  git pull origin  Jgit代码:CredentialsProvider provider = new UsernamePasswordCredentialsProvider(userName, password);  //生成身份信息 git.pull()         .setRemoteBranchName("master")  //设置需要pull的远端分支         .setCredentialsProvider(provider)  //身份验证         .call(); 结果:
  3.克隆(Clone)git命令:
  git clone http://admin@10.179.2.14:10101/r/Test/test01.git  Jgit代码://克隆 CredentialsProvider provider = new UsernamePasswordCredentialsProvider(userName, password);  //生成身份信息 File localpath = new File(localPath); Git git = Git.cloneRepository()         .setURI(remotePath)   //设置git远端URL         .setDirectory(localpath)  //设置本地仓库位置         .setCredentialsProvider(provider)   //设置身份验证         .setCloneSubmodules(true)    //设置是否克隆子仓库         .setBranch(branch)  //设置克隆分支         .call();   //启动命令 git.getRepository().close();   git.close();     //关闭源,以释放本地仓库锁 参数:String localPath = "C:Usersyang.yangDesktoptest";    //本地仓库位置 String remotePath = "http://admin@10.179.2.14:10101/r/Test/test01.git";  //远端仓库URL String branch = "master";   //克隆目标分支 String userName = "admin";  //远端仓库用户名 String password = "admin";  //远端仓库密码密码 结果:
  4.设置远程连接(Set Remote)git命令:
  git remote master http://admin@10.179.2.14:10101/r/Test/test01.git  Jgit代码:git.remoteAdd()         .setName("master")   //设置remote名字         .setUri(new URIish("http://admin@10.179.2.14:10101/r/Test/test01.git"))  //设置url         .call(); 结果:
  5.删除远程连接(Remove remote)git命令:
  git remote rm master  Jgit代码:git.remoteRemove()         .setRemoteName("master")         .call(); 结果:
  6.获取所有远程连接(All Remote)git命令:
  git remote -v  Jgit代码:Map urlMap = new HashMap<>();     List remoteConfigList = git             .remoteList()   //获取list             .call();     for (RemoteConfig x : remoteConfigList) {         urlMap.put(x.getName(), x.getURIs().toString());   //获取名字,获取URL     }    System.out.println(urlMap); 结果:
  六、标签(Tag)1.创建标签(Create Tag)git命令:
  git -a V1.0 -m "test tag" 9167dadd48bca196208a4687b5d4706e355c42b6  Jgit代码: ObjectId id = git.getRepository().resolve("9167dadd48bca196208a4687b5d4706e355c42b6");  //获取提交的ObjectID             RevWalk walk = new RevWalk(git.getRepository());   //获取RevWalk对象             RevCommit commit = walk.parseCommit(id);   //获取该commitID的RevCommit对象             git.tag().setObjectId(commit)  //设置commit                     .setName("V1.0")  //设置tag名字                     .setMessage("test tag")  //设置tag注释 //                    .setAnnotated()  //是否为annotate                     .call(); 结果:
  2.所有标签(All Tag)git命令:
  git tag  Jgit代码:  List refList = git.tagList().call();  //获取所有tag             RevWalk walk = new RevWalk(git.getRepository());             for (Ref ref : refList) {                 System.out.println("commitID:"+walk.parseCommit(ref.getObjectId()).getName());  // 通过ref获取objectID                 System.out.println("tagName:" + ref.getName());                                 // 然后通过walk获取commit对象再获																								   // 取commitId             } 结果:
  3.删除标签(Delete Tag)git命令:
  git tag -d V1.0  Jgit代码:git.tagDelete()         .setTags("V1.0")   //设置tag名         .call(); 结果:
  4.将标签推送至远程(Push Tag)git命令:Jgit代码:CredentialsProvider provider = new UsernamePasswordCredentialsProvider(userName, password);  //生成身份信息 git.push().setRemote("origin")  //设置remote         .setPushTags()   //pushtag         .setCredentialsProvider(provider)         .call(); 备注:
  默认是推送当前仓库内所有tag,单个推送目前没找到方法,得自行研究。  结果:
  七、差异对比(Diff)1.两个版本之间的对比(Between two Commit)git命令:
  git diff HEAD HEAD^  Jgit代码:ByteArrayOutputStream outputStream = new ByteArrayOutputStream();             AbstractTreeIterator newTreeIter = prepareTreeParser(git.getRepository(), git.getRepository().resolve("HEAD").getName());             AbstractTreeIterator oldTreeIter = prepareTreeParser(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()); public static AbstractTreeIterator prepareTreeParser(Repository repository, String objectId) throws IOException {     try (RevWalk walk = new RevWalk(repository)) {         RevCommit commit = walk.parseCommit(ObjectId.fromString(objectId));         RevTree tree = walk.parseTree(commit.getTree().getId());         CanonicalTreeParser treeParser = new CanonicalTreeParser();         try (ObjectReader reader = repository.newObjectReader()) {             treeParser.reset(reader, tree.getId());         }         walk.dispose();         return treeParser;     } } 备注:
  prepareTreeParser是一个把RevCommit对象转换成AbstractTreeIterator方法,Jgit中的Tree和Ref是存储git对象的类,具体作用请阅读文尾的官方文档。
  当diff()方法中不指定NewTree和OldTree时,默认比较工作区和当前分支最后一次commit的区别。  结果:
  2.当前暂存区与最后一次提交之间的对比(Current staging area and last commit)git命令:
  git diff  Jgit代码:git.diff()                   .setOutputStream(outputStream) //输出流  用outputStream,后面转成字符串        .call(); System.out.println(outputStream.toString()); 结果:
  八、回溯(Reset&Revert)1.Resetgit命令:
  git reset  Jgit代码:RevWalk walk = new RevWalk(git.getRepository());    //获取walk对象 ObjectId objectId = git.getRepository().resolve("9167dadd48bca196208a4687b5d4706e355c42b6");   //ObjectId对象 RevCommit revCommit = walk.parseCommit(objectId);   //获取Revcommit对象 String perVision = revCommit.getParent(0).getName();   //获取commit的身份名 git.reset().setMode(ResetCommand.ResetType.HARD).setRef(perVision).call();  //设置参数 结果:
  2.Revertgit命令:
  git revert  Jgit代码:RevWalk walk = new RevWalk(git.getRepository()); RevCommit revCommit = walk.parseCommit(ObjectId.fromString(commitid)); git.revert().include(revCommit).call(); 结果:
  备注:
  Reset和Revert结果比较复杂,演示的只是一个可行的方法,具体应用请查看文尾的官方文档。  九、参考链接
  参考文档:https://github.com/centic9/jgit-cookbook
  官方文档:http://archive.eclipse.org/jgit/site/5.3.0.201903130848-r/apidocs/index.html

世界上最富有的足球球员是谁?世界上最富的球员?现役是C罗无疑!其次是梅西。众所周知,梅西是这个星球工资最高的足球运动员,年薪高达4050万欧元,折合人民币约3。1亿元。如果按照一个赛季为球队出场45次计算,梅为什么现在的NBA很难涌现出统治级别的球员呢?自古以来,越靠近篮框命中率越高,而现在打法导致整体投篮点往外线移,命中率自然会下降,但为什么整场比赛得分反而比以前高很多,那是因为速度加快回合数增多规则导致罚球也多。我们一般说统治世界足坛最全能的球员是谁?为什么?纵观世界足坛,虽然英才辈出,然而真正的全能型球星却并不多见,绝大多数的球员都只擅长某个位置,要么前锋要么后卫要么中场,在场上各个位置均能游刃有余的少之又少。这么一遴选,马拉多纳罗纳目前男篮阵容当中,哪些球员能够称得上亚洲顶级球员,而不仅仅是国内顶级?处于亚洲顶级,目前除了阿联,还真没有他人。中国男篮在亚运会夺冠以后重新回到了亚洲霸主的地位,但是亚洲霸主也并不意味着队内所有的球员都是亚洲顶级的,在现有国家队球员中我认为易建联,郭航班被熔断,归化球员只能在机场的椅子过夜,你怎么看?航班被熔断归化球员只能在机场椅子过夜,客观因素是最为主要的,但是类似的问题也不是第一次出现在这一支中国男足上面了。缺乏预案,按照现在的处境,很多预案其实都并不满意。毕竟熔断是突如其世界足坛历史上速度最快的五位球员分别是谁?你如何评价他们?速度是一名球员撕开防守的利器,足坛历史上有很多依靠速度成名的前锋,比如风之子卡尼吉亚贝尔埃尔顿。如果只排出前五,我觉得太少了,我排出了十名球员,供大家参考。第十位梅西梅西的速度优势美国民众是否承认和支持,自己是一个霸权国家?美国确实很民主,老百姓想说什么就说什么。所以你如果问美国民众关于霸权主义的态度,每个人都会有自己独特的观点,不用看谁脸色行事,也不用担心说错话出问题。这和在伊朗沙特等国,是完全不同天津女排外援瓦尔加斯,她的扣球能力超过朱婷等国家队员吗?看到瓦尔加斯的弹跳力,扣球高度,挥臂力量,感觉我国内的接应队员,实力确实没法比,这和亚洲人种也有一定关系,所以亚洲球队主攻手和接应,如果没有1。90米以上身高很难和殴美队员抗衡。由日本和韩国8大高手被淘汰,国乒拿下男单冠军是否迎来了天赐良机?休斯顿世乒赛,好像让世界乒坛男单变天了!日本韩国两支劲旅,基本上在第二轮就呈现出全军覆没之势,而欧洲选手们都扮演了巨人杀手的角色。那么,日韩高手们出局之后,国乒男单是否迎来了春天呢周琦下场后攻防两端都乱了,如何看待周琦在中国男篮的作用?周琦也就是欺负日本人太矮,他的技术和机动性不错,跟胡金秋的双塔配合好,这也要少吹周琦为了来日本参赛,他此前被隔离,甚至崴脚后要瘸着去澳大利亚,虽然这是他为国出战的本分,但我们都应该公办教师被撤销教师资格编制有影响吗?提问本身就语意不明。取消的是教师资格,这是肯定的了,可后面又带个编制二字,就让人费解了,是否是连教师编制也取消了?实践中,存在这几种可能,取得了教师资格证,但没能考上公办教师编制,
华为抢先苹果支持卫星通信!全球首颗北斗短报文SoC芯片进入量产在华为和苹果的带动下,卫星通信成为最近热议的话题之一,业内猜测,华为将携手北斗三号系统实现手机卫星通信技术的大众化应用。日前,国内独立第三方集成电路测试技术服务商利扬芯片发布公告称81年前日本向中国宣战的前一天,突然逮捕3000名思想犯78年前的今天,1944年7月18日,日本首相东条英机辞职。这预示着,日本在对外宣战2年半后,将转向战争的终点。2年9个月前,同样是在18日,即1941年10月18日,东条英机破例GDP翻13倍,烂牌打成王炸,卢旺达感谢中国让我们抄作业我们的总统是被蟑螂一样的图西族人谋杀的,我们要为他报仇!1994年4月7日,位于非洲中东部的弹丸小国卢旺达,突然爆发了一场惨无人道的大屠杀。跟历史上的屠杀事件不同,这次的主角是卢旺西北工业大学遭美网络攻击,揭秘幕后黑手特定入侵行动办公室曾上万次恶意攻击中国TAO通过互联网入侵外国目标的电脑窃取数据,并监控通信来收集有关情报据央视新闻5日报道,国家计算机病毒应急处理中心和360公司今日分别发布了关于西北工业大学遭受境外网络攻击的调查报2022年中国企业500强榜单出炉,国家电网公司再登榜首2022年中国企业500强榜单出炉,国家电网公司再登榜首,国家电网公司自2002年成立以来,以投资建设运营电网为核心业务,承担着保障安全经济清洁可持续电力供应的基本使命。国家电网公港口助力通江达海链全球数据里的中国活力人民时评卫星导航的无人驾驶智能导引车灵活穿梭于码头和堆场之间,自动轨道吊车精准吊装集装箱到预设位置当前正是传统外贸进出口旺季,在各大港口,随处可见繁忙有序的作业场景。交通运输部数据显示,7中国罕王高派息关注长期成长性文章来源香港文汇报近期港股表现低迷,多重不确定因素交织,市场避险情绪加剧,操作上宜倾向中长线具有较强逻辑支撑且估值修复空间较大的个股。中国罕王(3788)是内地风电球墨铸铁头部供应德国在华投资最大单体项目投产,外交部德企看好中国中国青年报客户端北京9月7日电(中青报中青网记者胡文利)9月6日,德国巴斯夫集团在广东湛江投资的巴斯夫(广东)一体化基地项目,举行了全面建设暨首套装置投产仪式。对此,中国外交部发言6个优质的国产软件,款款精挑细选,让你的Windows电脑更好用很多人都喜欢用外国软件,其实有很多国产软件也非常好用,今天给大家推荐6个优质的国产软件,款款精挑细选,让你的Windows电脑更好用。01。Fences(桌面瞬间整洁)这是一款专注周三比赛分布横滨水手该反弹了,热刺拿下马赛迎开门红?昨日在晚场层面上大获全胜,首先说萨迪纳摩这场,更多问题还是在切尔西自身,这场看好萨迪纳摩是没问题的,而至于凯尔特人跟皇马这场,果然姜的还是老的辣,银河战舰稳稳拿下,还有解放者杯这场外媒爆料曼城球员FIFA23评分德布劳内91埃德森89哈兰德88直播吧9月7日讯FIFA23将在9月底发售,外媒爆料了部分曼城球员评分,德布劳内91分居首,门将埃德森89分第二,哈兰德88分第三。德布劳内91埃德森89哈兰德88B席88鲁本迪亚