2016-11-07 2 views
1

GIT 저장소에서 파일을 마지막으로 변경/커밋 한 사용자가 필요합니다.JGit을 사용하여 마지막으로 파일을 변경 한 사람을 찾는 방법

프로젝트는 여러 하위 폴더로 구성되며 마스터 분기에는 많은 병합 된 커밋이 있습니다.

내가 시도 :

File gitWorkDir = new File("D:/gitfolder/"); 
Git git = Git.open(gitWorkDir); 
RevCommit latestCommit; 
String path = "test.txt"; 
try(RevWalk revWalk = new RevWalk(git.getRepository())) { 
    Ref headRef = git.getRepository().exactRef(Constants.HEAD); 
    RevCommit headCommit = revWalk.parseCommit(headRef.getObjectId()); 
    revWalk.markStart(headCommit); 
    revWalk.sort(RevSort.COMMIT_TIME_DESC); 
    TreeFilter filter = AndTreeFilter.create(PathFilter.create(path), TreeFilter.ANY_DIFF); 
    revWalk.setTreeFilter(filter); 
    latestCommit = revWalk.next(); 
    git.close(); 
} 

저장소와 HEAD가있다 커밋하지만 latestCommit는 항상 null입니다.

내 파일의 전체 경로를 정의해야합니까? master 브랜치가 "분기 된"것이므로 커밋을 찾을 수 없거나 다른 문제가있을 수 있다는 점이 문제가됩니까?

+0

당신이 마지막으로 ** 특정 ** 파일을 변경 저자를 알고 싶니? – clinical

+0

예, 약 500 개의 파일 목록이 있으며 각 파일에 대한 정보가 필요합니다. – Sirim

답변

1

git에서 나는 git log --follow path/to/your/file을 사용할 것입니다. 특정 파일의 전체 자식 내역 (파일 이름이 변경되었거나 파일이 다른 폴더로 이동 된 경우에도 작성자 커밋 포함)을 제공합니다.

JGit에서 이것을 수행하려면 this stackoverflow question을 확인하십시오.

Espacially이 부분은 (답 위에서 촬영) 기계류해야합니다

/** 
* Returns the result of a git log --follow -- <path> 
* @return 
* @throws IOException 
* @throws MissingObjectException 
* @throws GitAPIException 
*/ 
public ArrayList<RevCommit> call() throws IOException, MissingObjectException, GitAPIException { 
    ArrayList<RevCommit> commits = new ArrayList<RevCommit>(); 
    git = new Git(repository); 
    RevCommit start = null; 
    do { 
     Iterable<RevCommit> log = git.log().addPath(path).call(); 
     for (RevCommit commit : log) { 
      if (commits.contains(commit)) { 
       start = null; 
      } else { 
       start = commit; 
       commits.add(commit); 
      } 
     } 
     if (start == null) return commits; 
    } 
    while ((path = getRenamedPath(start)) != null); 

    return commits; 
}