JGit - --- Git 을 응용 프로그램 에 끼 워 넣 기

13561 단어 자바
자바 프로그램 에서 Git 을 사용 하려 면 기능 이 완 비 된 Git 라 이브 러 리 가 있 습 니 다. 바로 JGit 입 니 다.JGit 은 자바 로 작 성 된 기능 이 상대 적 으로 건전 한 Git 의 실현 으로 자바 커 뮤 니 티 에서 널리 사용 된다.JGit 프로젝트 는 Eclipse 에서 관리 합 니 다. 홈 페이지
의존 추가
JGit 을 프로젝트 에 의존 하고 코드 를 쓸 수 있 는 여러 가지 방법 이 있 습 니 다.가장 쉬 운 방법 은 아마도 Maven 을 사용 하 는 것 일 것 이다.pom. xml 파일 의 탭 에 아래 와 같은 세 션 을 추가 하여 통합 을 완성 할 수 있 습 니 다.
    
        org.eclipse.jgit
        org.eclipse.jgit
        5.5.1.201910021850-r
    

이 글 을 읽 었 을 때 version 이 업데이트 되 었 을 가능성 이 높 습 니 다. 최신 창고 정 보 를 얻 기 위해 서 http://mvnrepository.com/arti... 를 찾 아 보 세 요.이 단계 가 완료 되면 Maven 은 필요 한 JGit 라 이브 러 리 를 자동 으로 가 져 와 사용 합 니 다.
프로젝트 실천
구축 내 블 로그 과정 에서 이 블 로 그 는 자신의 서버 에 배치 되 어 있 기 때문에 ci 자동 컴 파일 이 완 료 된 후에 제 서버 에 자동 으로 배치 되 어야 합 니 다.
다음은 주로 pull 추출 방법 을 사용 하 였 습 니 다.
package com.easy.jGit.controller;

import lombok.extern.slf4j.Slf4j;
import org.eclipse.jgit.api.*;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.internal.storage.file.FileRepository;
import org.eclipse.jgit.lib.Repository;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;

@RestController
@Slf4j
public class JGitController {

    /**
     * git   
     */
    final String patch = "/opt/webapps/blog/.git";

    /**
     *     
     */
    final String branch = "origin/gh-pages";

    /**
     *   
     *
     * @return
     */
    @RequestMapping("/pull")
    public String pull() {
        String result;
        Repository repo = null;
        try {
            repo = new FileRepository(new File(patch));
            Git git = new Git(repo);

            log.info("    ");
            //  
            git.reset()
                    .setMode(ResetCommand.ResetType.HARD)
                    .setRef(branch).call();

            log.info("    ");

            //  
            git.pull()
                    .setRemote("origin")
                    .setRemoteBranchName("gh-pages")
                    .call();
            result = "    !";
            log.info(result);
        } catch (Exception e) {
            result = e.getMessage();
        } finally {
            if (repo != null) {
                repo.close();
            }
        }
        return result;
    }

    /**
     *   
     *
     * @return
     */
    @RequestMapping("/reset")
    public String reset() {
        String result;

        Repository repo = null;
        try {
            repo = new FileRepository(new File(patch));
            Git git = new Git(repo);
            git.reset().setMode(ResetCommand.ResetType.HARD).setRef(branch).call();
            result = "    !";

        } catch (Exception e) {
            result = e.getMessage();
        } finally {
            if (repo != null) {
                repo.close();
            }
        }
        return result;
    }

    /**
     *   
     */
    @RequestMapping("/revert")
    public String revert() {
        String result;

        Repository repo = null;
        try {
            repo = new FileRepository(new File(patch));
            Git git = new Git(repo);
            git.revert().call();
            result = "    !";

        } catch (Exception e) {
            result = e.getMessage();
        } finally {
            if (repo != null) {
                repo.close();
            }
        }
        return result;
    }

    /**
     *   
     *
     * @return
     */
    @RequestMapping("/clone")
    public String clone() {
        String result;
        try {
            Git.cloneRepository()
                    .setURI("https://github.com/smltq/blog.git")
                    .setDirectory(new File("/blog"))
                    .call();
            result = "     !";
        } catch (GitAPIException e) {
            result = e.getMessage();
            e.printStackTrace();
        }
        return result;
    }

    /**
     *   
     */
    @RequestMapping("/status")
    public static void status() {
        File RepoGitDir = new File("/blog/.git");
        Repository repo = null;
        try {
            repo = new FileRepository(RepoGitDir.getAbsolutePath());
            Git git = new Git(repo);
            Status status = git.status().call();
            log.info("Git Change: " + status.getChanged());
            log.info("Git Modified: " + status.getModified());
            log.info("Git UncommittedChanges: " + status.getUncommittedChanges());
            log.info("Git Untracked: " + status.getUntracked());
        } catch (Exception e) {
            log.info(e.getMessage());
        } finally {
            if (repo != null) {
                repo.close();
            }
        }
    }
}

. travis. yml 원본 파일
language: node_js #     
node_js: stable   #       
cache:
  apt: true
  directories:
    - node_modules #           
before_install:
  - export TZ='Asia/Shanghai' #     
  - npm install hexo-cli -g
  #- chmod +x ./publish-to-gh-pages.sh  #  shell         
install:
  - npm install #   hexo   
script:
  - hexo clean  #   
  - hexo g      #   
after_script:
  - git clone https://${GH_REF} .deploy_git
  - cd .deploy_git
  - git checkout master:gh-pages
  - cd ../
  - mv .deploy_git/.git/ ./public/
  - cd ./public
  - git config user.name  "tqlin"
  - git config user.email "[email protected]"
  # add commit timestamp
  - git add .
  - git commit -m "Travis CI Auto Builder at `date +"%Y-%m-%d %H:%M"`"
  - git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages && curl http://49.235.170.100:8787/pull
  - curl http://49.235.170.100:8787/pull   #             
branches:
  only:
    - master #    master  
env:
  global:
    - GH_REF: github.com/smltq/blog.git #  GH_REF

기본 개념
  • Repository 는 모든 대상 과 인용 을 포함 하여 소스 코드
  • 를 관리 합 니 다.
  • AnyObjectId 는 SHA 1 대상 을 의미 하 며, SHA 1 의 값 을 획득 하여 git 대상
  • 을 획득 할 수 있다.
  • Ref 인용 대상 은. git / refs 아래 파일 참조 Ref HEAD = reposcory. getRef ("refs / heads / master") 를 나타 낸다.
  • RevWalk 는 제출 대상 을 옮 겨 다 니 며 제출 대상 을 순서대로 되 돌려 줍 니 다
  • RevCommit 는 제출 대상 자 를 대표 한다
  • RevTag 대표 태그 대상
  • RevTree 대표 나무 대상
  • 기타 상용 명령
    대부분의 JGit 세 션 은 Repository 클래스 를 시작 으로 합 니 다. 먼저 해 야 할 일 은 인 스 턴 스 를 만 드 는 것 입 니 다.파일 시스템 기반 창고 의 경우 (JGit 은 다른 저장 모델 을 허용 합 니 다) FileRepository Builder 로 완성 합 니 다.
    //        
    Repository newlyCreatedRepo = FileRepositoryBuilder.create(
        new File("/tmp/new_repo/.git"));
    newlyCreatedRepo.create();
    
    //          
    Repository existingRepo = new FileRepositoryBuilder()
        .setGitDir(new File("my_repo/.git"))
        .build();

    Repository 인 스 턴 스 를 가지 고 있 으 면 여러 가지 일 을 할 수 있 습 니 다.예 를 들 면:
    //     
    Ref master = repo.getRef("master");
    
    //            
    ObjectId masterTip = master.getObjectId();
    
    // Rev-parse
    ObjectId obj = repo.resolve("HEAD^{tree}");
    
    //         
    ObjectLoader loader = repo.open(masterTip);
    loader.copyTo(System.out);
    
    //     
    RefUpdate createBranch1 = repo.updateRef("refs/heads/branch1");
    createBranch1.setNewObjectId(masterTip);
    createBranch1.update();
    
    //     
    RefUpdate deleteBranch1 = repo.updateRef("refs/heads/branch1");
    deleteBranch1.setForceUpdate(true);
    deleteBranch1.delete();
    
    //   
    Config cfg = repo.getConfig();
    String name = cfg.getString("user", null, "name");

    명령 을 제출 하 다
    AddCommand 는 작업 영역의 내용 을 임시 저장 소 에 추가 할 수 있 습 니 다.
    Git git = Git.open(new File("D:\\source-code\\temp\\.git"));
    git.add().addFilepattern(".").call(); //    git add -A         git.add().addFilepattern("*.java")         
    git.add().addFilepattern("src/main/java/").call(); //     ,                
    //jgit             ,  *.java

    CommitCommand 는 제출 작업 에 사 용 됩 니 다.
    Git git =Git.open(new File("D:\\source-code\\temp\\user1\\.git"));
    CommitCommand commitCommand = git.commit().setMessage("master 23 commit").setAllowEmpty(true);
    commitCommand.call();

    status 명령
        Git git = Git.open(new File("D:\\source-code\\temp-1\\.git"));
        Status status = git.status().call();        //              ,       
        status.getAdded().forEach(it -> System.out.println("Add File :" + it));      //git add        
        status.getRemoved().forEach(it -> System.out.println("Remove File :" + it));  ///git rm       ,           
        status.getModified().forEach(it -> System.out.println("Modified File :" + it));  //       
        status.getUntracked().forEach(it -> System.out.println("Untracked File :" + it)); //          
        status.getConflicting().forEach(it -> System.out.println("Conflicting File :" + it)); //       
        status.getMissing().forEach(it -> System.out.println("Missing File :" + it));    //          

    로그 명령
    LogCommand 는 git log 명령 에 해당 합 니 다.
    //         ,       
    Git git = Git.open(new File("D:\\source-code\\temp-1\\.git"));
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Iterable results = git.log().setRevFilter(new RevFilter() {
        @Override
        public boolean include(RevWalk walker, RevCommit cmit)
           throws StopWalkException, MissingObjectException, IncorrectObjectTypeException, IOException {
            return cmit.getAuthorIdent().getName().equals("xxxxx dsd");
        }
    
        @Override
        public RevFilter clone() {
        return this;
                }
            }).call();
    results.forEach(commit -> {
        PersonIdent authoIdent = commit.getAuthorIdent();
        System.out.println("   :  " + authoIdent.getName() + "     ");
        System.out.println("  SHA1:  " + commit.getId().name());
        System.out.println("    :  " + commit.getShortMessage());
        System.out.println("    :  " + format.format(authoIdent.getWhen()));
    });

    fetch 명령
    fetch 명령
    Repository rep = new FileRepository("D:\\source-code\\temp-1\\.git");
    Git git = new Git(rep);
    git.pull().setRemote("origin").call();
    //fetch     setRefSpecs  , pull       ,  pull    fetch     
    git.fetch().setRefSpecs("refs/heads/*:refs/heads/*").call();

    push 명령
    PushCommand 는 git push 와 마찬가지 로 사용자 이름과 비밀 번 호 를 제공 해 야 합 니 다. Credentials Provider 클래스 를 사용 해 야 합 니 다.
    Repository rep = new FileRepository("D:\\source-code\\temp-1\\.git");
    Git git = new Git(rep);
    git.push().setCredentialsProvider(new UsernamePasswordCredentialsProvider("myname", "password")).call();

    클론 명령
    Clone Command 등가 와 git clone 명령
    Git.cloneRepository().setURI("https://admin@localhost:8443/r/game-of-life.git")
                    .setDirectory(new File("D:\\source-code\\temp-1")).call();

    RevWalk API
    다음 코드 는 이러한 기능 을 실현 하여 특정한 파일 의 역사 기록 을 찾 고 제출 한 모든 파일 내용 을 인쇄 합 니 다.
     DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     Repository repository = new RepositoryBuilder().setGitDir(new File("D:\\source-code\\temp-1\\.git")).build();
     try (RevWalk walk = new RevWalk(repository)) {
         Ref head = repository.findRef("HEAD");
         walk.markStart(walk.parseCommit(head.getObjectId())); //  HEAD    ,
         for (RevCommit commit : walk) {
             RevTree tree = commit.getTree();
    
             TreeWalk treeWalk = new TreeWalk(repository, repository.newObjectReader());
             PathFilter f = PathFilter.create("pom.xml");
             treeWalk.setFilter(f);
             treeWalk.reset(tree);
             treeWalk.setRecursive(false);
             while (treeWalk.next()) {
                 PersonIdent authoIdent = commit.getAuthorIdent();
                 System.out.println("   : " + authoIdent.getName() + " ");
                 System.out.println("  SHA1: " + commit.getId().name());
                 System.out.println("    : " + commit.getShortMessage());
                 System.out.println("    : " + format.format(authoIdent.getWhen()));
    
                 ObjectId objectId = treeWalk.getObjectId(0);
                 ObjectLoader loader = repository.open(objectId);
                 loader.copyTo(System.out);              //  blob     
             }
         }
     }

    기타 더 많은 명령 참조 홈 페이지
    자료.
  • JGit 예제 소스 코드
  • JGit 공식 문서

  • Spring Boot, 클 라 우 드 학습 프로젝트

    좋은 웹페이지 즐겨찾기