JGit使用

  1. 添加pom依赖

    <!--JGit start-->
    <dependency>
    <groupId>org.eclipse.jgit</groupId>
    <artifactId>org.eclipse.jgit</artifactId>
    <version>4.8.0.201706111038-r</version>
    </dependency>
    <!--JGit end-->
    
  2. git clone

     /**
      * git clone
      *
      * @param remoteUrl git地址
      * @param repoDir   本地仓库地址
      */
     public static void gitClone(String remoteUrl, File repoDir){
         try{
             Git git = Git.cloneRepository()
                     .setURI(remoteUrl)
                     .setDirectory(repoDir)
                     .call();
             logger.info("Cloning from " + remoteUrl + " to " + git.getRepository());
    
         }catch(Exception e){
             logger.error(e.getMessage());
         }
     }
    
     @Test
     public void gitClone() throws Exception{
         //http & ssh都可以用
         // String url = "[email protected]:demo/demo.git";
         String url = "http://gitlab.corp.qunar.com/zhanghe.zhang/springboot_homework.git";
         File repoDir = new File("/home/download");
    
         JGitUtil.gitClone(url, repoDir);
     }
    
  3. git checkout切换分支

     /**
      * 切换分支
      *
      * @param repoDir
      * @param version
      */
     public static void gitCheckout(File repoDir, String version){
         File repoGitDir = new File(repoDir.getAbsolutePath() + "/.git");
         if (!repoGitDir.exists()){
             logger.info("Error! Not Exists : " + repoGitDir.getAbsolutePath());
         }else{
             Repository repo = null;
             try{
                 repo = new FileRepository(repoGitDir.getAbsolutePath());
                 Git git = new Git(repo);
                 CheckoutCommand checkout = git.checkout();
                 checkout.setName(version);
                 checkout.call();
                 logger.info("Checkout to " + version);
             }catch(Exception e){
                 logger.info(e.getMessage() + " : " + repoGitDir.getAbsolutePath());
             }finally{
                 if (repo != null){
                     repo.close();
                 }
             }
         }
     }
    
  4. git diff

     /**
      *
      * @param repoDir 本地仓库地址
      * @param branch1 分支名称
      * @param branch2 分支名称
      */
     public static void gitDiff(File repoDir,String branch1,String branch2) {
         File repoGitDir = new File(repoDir.getAbsolutePath() + "/.git");
         if (!repoGitDir.exists()) {
             logger.info("Error! Not Exists : " + repoGitDir.getAbsolutePath());
         } else {
             try {
                 Git git = Git.open(repoGitDir);
                 Repository repository = git.getRepository();
                 ObjectReader reader = repository.newObjectReader();
                 CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
    
                 try {
                     //分支1
                     ObjectId old = repository.resolve(branch1 + "^{tree}");
                     //分支2
                     ObjectId head = repository.resolve(branch2+"^{tree}");
    
                     oldTreeIter.reset(reader, old);
                     CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
                     newTreeIter.reset(reader, head);
                     List<DiffEntry> diffs= git.diff()
                             .setNewTree(newTreeIter)
                             .setOldTree(oldTreeIter)
                             .call();
    
                     ByteArrayOutputStream out = new ByteArrayOutputStream();
                     DiffFormatter df = new DiffFormatter(out);
                     df.setRepository(repository);
    
                     for (DiffEntry diffEntry : diffs) {
                         df.format(diffEntry);
                         logger.info("diffEntry:{}",diffEntry.toString());
                         logger.info("--------------------------------------------");
                         String diffText = out.toString("UTF-8");
                         logger.info("diffText:{}",diffText);
                         out.reset();
                     }
                 } catch (IncorrectObjectTypeException e) {
                     logger.error(e.getMessage());
                 } catch (IOException e) {
                     logger.error(e.getMessage());
                 } catch (GitAPIException e) {
                     logger.error(e.getMessage());
                 }
             } catch (Exception e) {
                 logger.error(e.getMessage() + " : " + repoDir.getAbsolutePath());
             }
         }
     }
    
CanonicalTreeParser
CanonicalTreeParser extends AbstractTreeIterator 将文本/二进制格式解析为Git树
public void reset(final ObjectReader reader, final AnyObjectId id) 重置解析器,遍历给定的树

git diff 解释器

  • 第一行是 Git Diff 的 header,进行比较的是 a 版本的 f1(变动前)和b 版本的f1(变动后)
  • 第二行是两个版本的 hash 值以及文件模式(100644 表示是文本文件)
  • 第三、四行表示进行比较的两个文件,--- 表示变动前的版本,+++ 表示变动后的版本
  • 第五行是一个 thunk header(可能会有多个),提供变动的"上下文"(context),-8,11 表示接下来展示变动前文件第八行开始,共显示十一行,+8,7 表示接下来展示变动后文件第八开始,共显示第十二行
  • 接下来的几行就是具体的变动内容.它将两个文件的上下文合并显示在一起,每一行前面是一个标志位,''(空)表示无变化(是一个上下文行)、- 表示变动前文件删除的行、+ 表示变动后文件新增的行
diff --git a/data_center/pom.xml b/data_center/pom.xml
index 454d9e6..c1dcac0 100644
--- a/data_center/pom.xml
+++ b/data_center/pom.xml
@@ -8,11 +8,12 @@
     <parent>
         <groupId>com.qunar.fuwu</groupId>
         <artifactId>audiebant_platform</artifactId>
-        <version>0.0.11</version>
+        <version>0.0.14</version>
     </parent>
     <artifactId>data_center</artifactId>
     <packaging>war</packaging>
+    <version>0.0.14</version>
     <properties>
         <kotlin.version>1.0.1</kotlin.version>
@@ -87,7 +88,7 @@
             <dependency>
                 <groupId>com.qunar.fuwu</groupId>
                 <artifactId>data_center_api</artifactId>
-                <version>0.0.11</version>
+                <version>0.0.14</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.commons</groupId>

results matching ""

    No results matching ""