得到的裸库子模块哈希
我们与客户gitolite服务器的自定义应用得到的裸库子模块哈希
每一个应用程序有一个子模块“库/芯”是指我们的基本应用。
我们现在想要创建一个仪表板,显示我们所有的客户应用程序以及核心所在的版本。
gitolite将所有内容都存储在磁盘上的裸存储库中,并且仪表板应用程序直接访问repos /或使用ssh密钥(如果更容易)。
我的问题是,我将如何从裸仓库找出子模块在哪个版本上, 和谁承诺它?
可以列出.gitmodules
找出哪些路径被认为是模块,然后通过他们去找出什么<module>.git/HEAD/
引用指向(可能是一个象征性的参考,像ref: refs/heads/master
,这你再有以链发现价值refs/heads/master
)。这会给你最近的那个模块的提交散列。
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,我前一段时间写的有更多的细节。
对于纯仓库你就必须从资源库中的对象数据库,像这样直接读取子模块的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
}
}
我只是实现这个的CI服务器。棘手的部分是保持裸露结账。
我的解决办法如下:
1)git show HEAD:.gitmodules
可以用来获得的其是子模块的路径列表。每个path =
2),这第三个字段可以用来确定SHA子模块是:
git ls-tree -z -d HEAD -- <submodule path>
这是与裸仓库合作的唯一答案。奖金:它不需要任何东西比混帐。 – 2018-02-01 16:07:22
我是新来jGit,做什么类型的“混帐”在你的榜样,我从哪里得到它? – 2014-09-24 14:32:32
我得到了NoWorkTreeException:Bare Repository既没有工作树,也没有索引,因为我在裸仓库上运行它。有没有解决方法? – 2014-09-24 14:38:08
Git是一个工厂类,可以用来创建命令(类似于本地Git的瓷器命令)。一个Git实例绑定到为其创建的存储库。创建这种Git实例的一种方法是通过Git.open(File)。另请参阅现在扩展的答案。 – 2014-09-24 14:41:49