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

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

学中医就看这四部医学经典中医学理论体系形成的标志是黄帝内经难经伤寒杂病论神农本经等四部医学经典著作的问世。黄帝内经简称内经,为中医学现存最早的经典著作。本书分为素问和灵枢两部,共18卷162篇。约成书于战火箭将用十天短合同签下考利斯坦据休斯顿纪事报记者乔纳森费根报道,火箭将用一份十天短合同签下中锋威利考利斯坦。在交易截止日前后的一系列赛操作,包括交易和买断丹尼格林和贾斯汀霍乐迪的合同后,火箭阵容当中出现了两个空2023桂林马拉松3月26日开跑!现已开始接受报名近日,记者从桂林马拉松组委会获悉,2023桂林马拉松将于3月26日开跑。报名工作现已启动,感兴趣的跑友可通过赛事官方微信公众号第一赛道桂林马拉松及赛事官方网站等途径进行报名。据悉,12分8助!在场赢21分,篮球名记没他中国男篮恐怕要输给伊朗乔尔杰维奇又打带队打了一场惊心动魄的比赛,在与伊朗的比赛中,中国队上半场毫无优势,一直落后于伊朗队,下半场由于对手三分命中率下降,让中国队抓住了机会,最终逆转了对手,赢得一点也不轻官宣一夜3签约!火箭签约2910中锋,太阳瞄准沃尔,老詹又遭重创北京时间2月28日,NBA消息官宣一夜3签约!火箭签约2910中锋,太阳瞄准沃尔,老詹又遭重创。先说詹姆斯,根据名记shams的最新报道,老詹的右脚扭伤,伤势并不轻,昨天比赛结束后巴特勒防守上我是个赌徒,今天我赌对了今日常规赛,热火10199击败76人,结束了4连败。赛后,吉米巴特勒接受了采访。巴特勒本场拿到4次抢断。谈到自己的防守策略,巴特勒说我是个赌徒,今天我就是赌对了。我会出现在对手的传赚翻!怀斯曼237全场比赛零失误零犯规!巴格利替补砍下2112北京时间2023年2月28日,NBA常规赛,活塞客场挑战黄蜂!四节战罢,活塞106117不敌黄蜂!大聪明怀斯曼活塞虽然比赛失利,但是管理层不但不会失望,反而觉得赚大发了!交易来的两韩足协委员会主席称梅西奖项太多不用投给他,穆勒该学瓜帅的发言韩国足协实力强化委员会主席迈克尔。穆勒解释他为什么不投票梅西。穆勒说我代替韩国队主帅投了贝林厄姆哈兰德阿什拉夫,不投梅西是因为梅西得到太多的奖项了!如果下次有机会和梅西见面的话,我用第二大脑实现个人专有ChatGPT近来智能聊天机器人ChatGPT的爆火,让我也体验了几次ChatGPT。第一次是春节前家里的狗狗斗斗没了,女儿用ChatGPT和斗斗聊天,人机对话里的斗斗,确确实实安抚疗愈了女儿。认识大脑之二睡眠与大脑睡觉,本来是一件非常自然的事,如呼吸空气一样自然,是一件放松又快乐的事情。但现实中,我们很多人都有过失眠的经历?有人说失眠,人生路上不可避免的邂逅,因为3亿中国人有睡眠障碍。如何才AI直播有可能代替网红的工作近年来,随着人工智能(AI)技术的不断发展,AI直播技术也在迅速发展。AI直播技术可大大提高观众和主播之间的互动性,并帮助观众更好地接触和理解主播。AI直播技术主要是利用人工智能算
超高颜值鸿蒙系统,华为nova10z第一时间上手体验报告,稳中求胜最近大家都在关注华为Mate50系列,据说华为Mate50系列首销销量已经超过400万台,可见大家对华为Mate50系列还是非常喜欢的,另外,还有一款和华为Mate50系列同一天开中国女篮工资表李梦60万年薪最高,不到男篮的十分之一据悉,相比于男篮球员的高工资以及高奖金,女篮球员们的工资可以说是低得可怜,本届女篮世界杯12名参赛球员在俱乐部的合计年薪只有不到500万人民币,这个数字甚至不如CBA顶薪球员郭艾伦餐桌上的中医之道女人肾虚怎么吃本网讯提到肾虚,很多人都以为这是男人的专利其实不然!肾虚,实际上它是中医的概念。中医认为,肾是先天之本,是人体健康的根本。肾气的虚实变化,主宰人一生的生长发育,控制骨髓脑髓的生长。宝宝秋季腹泻如何护理来源安徽财经网什么是秋季腹泻?秋季腹泻是由轮状病毒感染引起的轮状病毒肠炎,是一种传染性疾病,好发于624个月婴幼儿,因多发生在秋冬寒冷季节,所以又称为秋季腹泻。秋季腹泻呈散发或小流庆祝胜利,女篮拒绝喝香槟,球衣带回自己洗,张镇麟妈妈变管家婆一场艰难的胜利,如果我们拥有李梦,中国女篮的实力和澳大利亚相比还是要占据一些上风,可惜的是赛前,李梦遭遇了发烧,虽然经过一天的紧急治疗,李梦的发烧从39。2度变成了38度,可是虚弱体坛联播中国女篮将帅感谢球迷,女排打巴西敢字当头击败东道主澳大利亚挺进世界杯决赛,中国女篮在国庆节之际让万千国人振奋。赛后,女篮将帅纷纷对支持自己的球迷表达了感谢,同时也展望了即将开始的世界杯决赛。王思雨罚球绝杀澳大利亚。女篮将请您教会您的孩子撒谎和甄别谎言大家好,我是云南大汉。这个话题有点违背了常识,但不是悖论,请听我与你细说。成年人的世界里,谎言充斥着各个角落,我们每个人都在学着甄别,判断我们接收到的信息是真是假,稍不留心就意味着国庆去看小脑斧上海动物园食肉宝宝幼儿园开班啦视频加载中今年国庆,食肉宝宝幼儿园将在上海动物园狮虎山东山对外展出。此次和游客见面的是2只美洲狮幼仔和2只孟加拉虎幼仔。幼儿园采用半开放的展出方式,面朝游客设有两个参观面,一个为半三国志11蜀汉阵营中被刻意削弱的九个角色,我都忍不住修改特技虽说三国志11这款经典的单机游戏在总体上秉承着尊刘贬曹的基调,然而也并不是所有的蜀汉阵营角色都能得到偏爱的。当中甚至也不乏被刻意削弱的名将,总之我自己在玩的时候就经常忍不住用编辑器羊了个羊9月30日第二关怎么过羊了个羊攻略9。30最新流程羊了个羊9。30关卡攻略今天也太难了吧,第二关表面很容易,还以为放水了,结果底下太多层了。今天布局比较简单,尽量挖深井区,盲盒也要尽量使用起来,其他的都只有34层的部分,尽量留着,逆水寒手游首测,天刀诛仙却闹了笑话,两大直播分区全被偷家了今日上午10时,不少人心心念念已久的逆水寒手游终于开启了首测,霎时间所有获得了测试资格的玩家都第一时间进入了游戏,那些职业主播更是心急,以至于逆水寒手游才刚刚开测就迅速席卷了各大直