2016-11-07 5 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です。

ファイルへのパス全体を定義する必要はありますか? マスターブランチが「分岐している」ので、コミットが見つからないか、それ以外に何が問題になるのでしょうか?

+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; 
} 
関連する問題