2016-11-21 11 views
1

В настоящее время я работаю над проектом Java с использованием JGit. Я все еще не использовал JGit, но я предполагаю, что его функциональность будет такой же, как и с обычным git.Листинг или архивирование не двоичных файлов из git repo

То, что я пытаюсь сделать, - это получить все не двоичные файлы и файлы под определенным размером из ветви git repo, и архивировать их в zip-файле. Эта задача может быть простой для репо с рабочим каталогом, поскольку я могу просто использовать git grep -Ic '' для перечисления всех не двоичных файлов, а затем передать эти файлы в git archive, однако это невозможно для голых репозиториев.

Буду Вам благодарен за помощью.

ответ

3

Вы можете использовать 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, чтобы определить, является ли данное содержание двоичное или текстовой.

+0

Это замечательно. Мне просто нужно определить, является ли файл двоичным или простым текстом. Благодарю. –

+1

См. Мое редактирование ответа. –

+0

Спасибо @ Rüdiger снова. Не знаю, как я буду использовать 'AttributesHandler.BINARY_RULE_KEY', поскольку он является приватным, но я думаю, что с этим я смогу справиться –

0

Команда называется git archive, и это намного лучше, чем беспокоиться о рабочих.

Вы можете исключить ненужные файлы с export-ignore attribute, репо-местный .git/info/attributes (или в голом репо, как у вас есть, просто info/attributes) могут быть удобно здесь. Кроме того, git ls-files|git check-attr --stdin --all - удобный набор стартеров для поиска того, что было помечено каким-либо или для произвольных коммитов (git ls-tree -r --name-only your.ref.here|git check-attr -a --stdin).

Вы можете поместить произвольные шаблоны в свои файлы атрибутов, например.

*.jpg export-ignore 
+0

Спасибо. Однако у меня есть несколько проблем. Прежде всего, JGit не полностью поддерживает атрибуты git, и даже если это так, насколько я понимаю, export-ignore указывает файлы и каталоги, а не типы файлов (в основном двоичные файлы и чрезвычайно большие файлы). Теперь я добавил часть о больших файлах. Во-вторых, 'git ls-files' не работает с голыми репозиториями (' git ls-tree' делает хотя) –

+0

Просто еще одна вещь. 'git check-attr' действительно замечательный, но, насколько я понимаю, он вернет атрибуты в соответствии с файлом атрибутов.Без каких-либо файлов с моей стороны git должен иметь возможность различать текстовые файлы и двоичные файлы. Я просто не знаю, как получить эту информацию от git, не говоря уже о JGit –

+1

_Humans_ может с трудом сказать, что такое «двоичный», а что нет. Это характеристика, и это немного произвольно. Текст в неожиданной кодировке может выглядеть двоично. Git пытается, или есть 'find -type f | xargs -d \\ n файл | grep -v:. * text', чтобы найти все, что не похоже на текст, на команду «файл» в качестве стартового набора. – jthill