Вы можете использовать JGit-х ArchiveCommand
производить архив. Его метод setPaths()
позволяет вам выбирать только определенные пути для включения.
Чтобы собрать список путей, вам необходимо проанализировать дерево фиксации для архивирования. Например:
TreeWalk treeWalk = new TreeWalk(repository);
treeWalk.setRecursive(true);
treeWalk.addTree(commit.getTree());
while(treeWalk .next()) {
if(!isBinary(treeWalk) {
filesToArchive.add(treeWalk.getPathString());
}
}
treeWalk.close();
Пример кода ходит весь дерево коммит в архив, получает содержимое каждого файла в дереве и вызывает вымышленный isBinary()
метод, чтобы определить, является ли его содержание текста или двоичным. Все недвоичные файлы добавляются в коллекцию filesToArchive
, которая может быть передана в ArchiveCommand
.
Для isBinary()
реализации вы можете добиться успеха в использовании поддержки атрибута JGit в:
Attributes attributes = new AttributesHandler(treeWalk).getAttributes();
boolean binary = attributes.isSet("binary");
AttributesHandler::getAttributes()
возвращает слиты атрибутов для текущего пути, представленного treeWalk
.
В качестве альтернативы, вы можете использовать RawText::isBinary()
для реализации методы isBinary()
так:
ObjectId blobId = getObjectId(0);
ObjectReader objectReader = repository.newObjectReader();
ObjectLoader objectLoader = objectReader.open(blobId);
byte[] bytes = objectLoader.getBytes();
objectReader.close();
booloean binary = RawText.isBinary(bytes);
RawText::isBinary
использует ту же эвристику как родную Git, чтобы определить, является ли данное содержание двоичное или текстовой.
Это замечательно. Мне просто нужно определить, является ли файл двоичным или простым текстом. Благодарю. –
См. Мое редактирование ответа. –
Спасибо @ Rüdiger снова. Не знаю, как я буду использовать 'AttributesHandler.BINARY_RULE_KEY', поскольку он является приватным, но я думаю, что с этим я смогу справиться –