2016-11-07 23 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始終爲空。

我必須爲我的文件定義整個路徑嗎? 這是一個問題,主分支是如此「分支」,所以也許提交不能被發現,或者還有什麼可能是問題?

+0

你想知道作者誰最後改變了** **具體文件? – clinical

+0

是的,我有一個約500個文件的列表,並需要每個文件的信息 – Sirim

回答

1

在git中,我會使用git log --follow path/to/your/file。它爲您提供了特定文件的完整git歷史記錄(包括提交作者,即使文件名已更改或文件已移至其他文件夾)。

爲了做到這一點與JGit退房this stackoverflow question

Espacially這部分應intresting(從上面回答):

/** 
* 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; 
} 
相關問題