Используйте JGit TreeWalk для вывода списка файлов и папок.

Я хотел бы использовать 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());
        }
    }
}

person Gaurav Sharma    schedule 12.11.2013    source источник


Ответы (2)


Git не отслеживает собственные каталоги. Вы можете получить непустые имена каталогов только из строки пути, полученной из TreeWalk.

См. Часто задаваемые вопросы по Git (ищите "пустой каталог") для подробного объяснения и возможные обходные пути.

person Rüdiger Herrmann    schedule 13.11.2013
comment
Похоже, мне нужно добавить файл .gitkeep в пустые каталоги, чтобы их можно было отслеживать. - person Gaurav Sharma; 13.11.2013
comment
Еще немного об этом трюке можно найти здесь - person Rüdiger Herrmann; 16.11.2013

Вам нужно установить для рекурсии значение 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());
    }
}
person robinst    schedule 13.11.2013
comment
Да, я уже использую это в некоторых проектах, базовый атрибут FileMode узлов дерева также позволяет обнаруживать символические ссылки, см. также jgit-cookbook по адресу github.com/centic9/jgit-cookbook/blob/master/src/main/java/org /, который показывает это в готовом к запуску примере. - person centic; 13.11.2013
comment
Это работает... частично. Rüdiger Herrmann прав в том, что пустые каталоги не будут перечислены. - person Gaurav Sharma; 13.11.2013