web-dev-qa-db-ja.com

JGitでコミットするためのファイルリストを取得する方法

私はGit機能が統合されるJavaベースの製品に取り組んでいます。Git機能の1つを使用して、ステージングによって10以上のファイルをGitリポジトリに追加しました。 1回のコミットでそれらをコミットすることによって。

上記のプロセスの逆は可能ですか?つまり、コミットの一部としてコミットされたファイルのリストを検索します。

git.log()コマンドを使用してコミットを取得しましたが、コミットのファイルリストを取得する方法がわかりません。

コード例:

Git git = (...);
Iterable<RevCommit> logs = git.log().call();
for(RevCommit commit : logs) {
    String commitID = commit.getName();
    if(commitID != null && !commitID.isEmpty()) {
    TableItem item = new TableItem(table, SWT.None);
    item.setText(commitID);
    // Here I want to get the file list for the commit object
}
}
11
Thamilarasan M

各コミットは、コミットを構成するすべてのファイルを示すツリーを指します。これには、この特定のコミットで追加、変更、または削除されたファイルだけでなく、このリビジョンに含まれるすべてのファイルが含まれることに注意してください。

コミットがRevCommitとして表されている場合、ツリーのIDは次のように取得できます。

ObjectId treeId = commit.getTree();

コミットIDが別のソースから発信されている場合は、関連付けられたツリーIDを取得するために最初に解決する必要があります。たとえば、ここを参照してください。 JGitを使用してSHA1 ID文字列からRevCommitまたはObjectIdを取得する方法は?

ツリーを反復処理するには、TreeWalkを使用します。

try (TreeWalk treeWalk = new TreeWalk(repository)) {
  treeWalk.reset(treeId);
  while (treeWalk.next()) {
    String path = treeWalk.getPathString();
    // ...
  }
}

特定のコミットで記録された変更のみに関心がある場合は、ここを参照してください: JGitを使用した差分の作成 またはここ: JGitを使用した最後のコミットに対するファイルの差分

14

この リンク で与えられたコードから少し編集しました。以下のコードを使用してみてください。

public void commitHistory(Git git) throws NoHeadException, GitAPIException, IncorrectObjectTypeException, CorruptObjectException, IOException, UnirestException 
{
    Iterable<RevCommit> logs = git.log().call();
    int k = 0;
    for (RevCommit commit : logs) {
        String commitID = commit.getName();
        if (commitID != null && !commitID.isEmpty())
        {
            LogCommand logs2 = git.log().all();
            Repository repository = logs2.getRepository();
            tw = new TreeWalk(repository);
            tw.setRecursive(true);
            RevCommit commitToCheck = commit;
            tw.addTree(commitToCheck.getTree());
            for (RevCommit parent : commitToCheck.getParents())
            {
                tw.addTree(parent.getTree());
            }
            while (tw.next())
            {
                int similarParents = 0;
                for (int i = 1; i < tw.getTreeCount(); i++)
                    if (tw.getFileMode(i) == tw.getFileMode(0) && tw.getObjectId(0).equals(tw.getObjectId(i)))
                        similarParents++;
                if (similarParents == 0) 
                        System.out.println("File names: " + fileName);
            }
        }
    }
}
0
Arutsudar Arut