2014-09-24 2 views
2

У нас есть сервер gitolite с нашими клиентами пользовательских приложенийполучить голый репозиторий подмодуль хэш

каждое приложение имеет подмодуль «репозиторий/ядро», который относится к нашему основному приложению.

Теперь мы хотели бы создать приборную панель, в которой будут показаны все приложения наших клиентов и на которых имеется ревизия.

gitolite хранит все в голых репозиториях на диске, а приложение панели мониторинга имеет прямой доступ к репозиториям/или с помощью ключей ssh, если это проще.

Мой вопрос: как я из открытого хранилища узнаю, какая версия подмодуля находится, и кто ее совершил?

ответ

1

Вы можете перечислить .gitmodules, чтобы выяснить, какие пути считаются модули, а затем пройти через них и выяснить, что <module>.git/HEAD/ ссылка указывает на (возможно символической ссылкой, как ref: refs/heads/master, которые вы затем к цепи, чтобы найти значение refs/heads/master). Затем вы получите последний хеш-код фиксации этого модуля.

2

JGit имеет SubmoduleStatusCommand, в котором перечислены все известные подмодули. Обратите внимание, что эта команда работает только с не-голыми репозиториями.

Git git = Git.open(new File("/path/to/repo/.git")); 
Map<String,SubmoduleStatus> submodules = git.submoduleStatus().call(); 
SubmoduleStatus status = submodules.get("repository/core"); 
ObjectId headId = status.getHeadId(); 

Как вы можете видеть, команда возвращает карту подмодулей названий вместе с соответствующими SubmoduleStatus который включает в себя SHA-1 Головной фиксацию.

Существует также article about JGit's submodule API, который я написал некоторое время назад, в котором есть более подробная информация.

Для голого репозитория вы должны прочитать Подмодуль голова ID непосредственно из базы данных объектов репозитория так:

try(RevWalk revWalk = new RevWalk(repository)) { 
    RevCommit headCommit = revWalk.parseCommit(repository.resolve(Constants.HEAD)); 
} 
try(TreeWalk treeWalk = TreeWalk.forPath(repository, "repository/core", headCommit.getTree())) { 
    ObjectId blobId = treeWalk.getObjectId(0); 
    ObjectLoader objectLoader = repository.open(blobId, Constants.OBJ_BLOB); 
    try(InputStream inputStream = objectLoader.openStream()) { 
    // read contents from the input stream 
    } 
} 
+0

Я новичок в jGit, какой тип делает «мерзавец» есть в ваш пример и откуда его получить? –

+0

Я получаю NoWorkTreeException: Bare Repository не имеет ни рабочего дерева, ни индекса, так как я запускаю его в открытом репозитории. есть ли обходной путь? –

+0

Git - это фабричный класс, который можно использовать для создания команд (аналогичных командам фарфора Git's). Экземпляр Git привязан к репозиторию, для которого он был создан. Один из способов создания такого экземпляра Git - через Git.open (File). См. Также расширенный ответ. –

1

Я просто должен был осуществить это для сервера CI. Трудная часть остается с обнаженной проверкой.

Мое решение было следующим:

1) git show HEAD:.gitmodules может быть использован, чтобы получить список путей, которые являются подмодули.

2) для каждого path =, третье поле это может быть использовано для определения SHA подмодуль находится по адресу:

git ls-tree -z -d HEAD -- <submodule path>

+0

Это единственный ответ, который работает с открытым репозиторием. бонус: он не требует ничего, кроме git. –

Смежные вопросы