获取裸存储库子模块哈希

时间:2014-09-24 14:05:56

标签: git jgit

我们的客户定制应用程序有一个gitolite服务器

每个应用都有一个子模块“repository / core”,它指的是我们的基本应用程序。

我们现在想要创建一个仪表板,显示我们所有客户的应用程序以及核心所在的版本。

gitolite将所有内容存储在磁盘上的裸存储库中,仪表板应用程序直接访问repos /或使用ssh密钥,如果这更容易。

我的问题是如何从裸存储库中找出子模块的修订版本, 谁承诺了呢?

3 个答案:

答案 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>