17

JGit を使用して、ヘッド リビジョンのすべてのファイルとフォルダーのリストを表示したいと考えています。TreeWalk を使用してすべてのファイルを一覧表示できますが、これはフォルダーを一覧表示しません。

これが私がこれまでに持っているものです:

public class MainClass {

    public static void main(String[] args) throws IOException {
        FileRepositoryBuilder builder = new FileRepositoryBuilder();
        Repository repository = builder
                .setGitDir(new File("C:\\temp\\git\\.git")).readEnvironment()
                .findGitDir().build();

        listRepositoryContents(repository);

        repository.close();
    }

    private static void listRepositoryContents(Repository repository) throws IOException {
        Ref head = repository.getRef("HEAD");

        // a RevWalk allows to walk over commits based on some filtering that is defined
        RevWalk walk = new RevWalk(repository);

        RevCommit commit = walk.parseCommit(head.getObjectId());
        RevTree tree = commit.getTree();
        System.out.println("Having tree: " + tree);

        // now use a TreeWalk to iterate over all files in the Tree recursively
        // you can set Filters to narrow down the results if needed
        TreeWalk treeWalk = new TreeWalk(repository);
        treeWalk.addTree(tree);
        treeWalk.setRecursive(true);
        while (treeWalk.next()) {
            System.out.println("found: " + treeWalk.getPathString());
        }
    }
}
4

2 に答える 2

24

recursive を false に設定して (ドキュメントを参照)、次のように歩く必要があります。

TreeWalk treeWalk = new TreeWalk(repository);
treeWalk.addTree(tree);
treeWalk.setRecursive(false);
while (treeWalk.next()) {
    if (treeWalk.isSubtree()) {
        System.out.println("dir: " + treeWalk.getPathString());
        treeWalk.enterSubtree();
    } else {
        System.out.println("file: " + treeWalk.getPathString());
    }
}
于 2013-11-13T10:12:49.003 に答える
4

Git は独自のディレクトリを追跡しません。TreeWalk から取得したパス文字列からのみ、空でないディレクトリ名を派生させることができます。

詳細な説明と考えられる回避策については、Git FAQ (「空のディレクトリ」を検索) を参照してください。

于 2013-11-13T08:56:29.270 に答える