我们的客户定制应用程序有一个gitolite服务器
每个应用都有一个子模块“repository / core”,它指的是我们的基本应用程序。
我们现在想要创建一个仪表板,显示我们所有客户的应用程序以及核心所在的版本。
gitolite将所有内容存储在磁盘上的裸存储库中,仪表板应用程序直接访问repos /或使用ssh密钥,如果这更容易。
我的问题是如何从裸存储库中找出子模块的修订版本, 谁承诺了呢?
答案 0 :(得分: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
,其中包括HEAD提交的SHA-1。
我前段时间还写了一篇article about JGit's submodule API,其中有更多细节。
对于裸存储库,您必须直接从存储库的对象数据库中读取子模块的HEAD 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
}
}
答案 1 :(得分:1)
您可以列出.gitmodules
以找出哪些路径被视为模块,然后浏览它们并找出<module>.git/HEAD/
引用指向的内容(可能是符号引用,如{ {1}},然后您必须链接以查找ref: refs/heads/master
的值。然后,它将为您提供该模块的最新提交哈希值。
答案 2 :(得分:1)
我只需要为CI服务器实现此功能。这个棘手的部分还有一个简单的结账。
我的解决方案如下:
1)git show HEAD:.gitmodules
可用于获取子模块的路径列表。
2)对于每个path =
,其中的第三个字段可用于确定子模块所在的SHA:
git ls-tree -z -d HEAD -- <submodule path>