得到的裸库子模块哈希

问题描述:

我们与客户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 
    } 
} 
+0

我是新来jGit,做什么类型的“混帐”在你的榜样,我从哪里得到它? – 2014-09-24 14:32:32

+0

我得到了NoWorkTreeException:Bare Repository既没有工作树,也没有索引,因为我在裸仓库上运行它。有没有解决方法? – 2014-09-24 14:38:08

+0

Git是一个工厂类,可以用来创建命令(类似于本地Git的瓷器命令)。一个Git实例绑定到为其创建的存储库。创建这种Git实例的一种方法是通过Git.open(File)。另请参阅现在扩展的答案。 – 2014-09-24 14:41:49

我只是实现这个的CI服务器。棘手的部分是保持裸露结账。

我的解决办法如下:

1)git show HEAD:.gitmodules可以用来获得的其是子模块的路径列表。每个path =

2),这第三个字段可以用来确定SHA子模块是:

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

+0

这是与裸仓库合作的唯一答案。奖金:它不需要任何东西比混帐。 – 2018-02-01 16:07:22