我們與客戶gitolite服務器的自定義應用得到的裸庫子模塊哈希
每一個應用程序有一個子模塊「庫/芯」是指我們的基本應用。
我們現在想要創建一個儀表板,顯示我們所有的客戶應用程序以及核心所在的版本。
gitolite將所有內容都存儲在磁盤上的裸存儲庫中,並且儀表板應用程序直接訪問repos /或使用ssh密鑰(如果更容易)。
我的問題是,我將如何從裸倉庫找出子模塊在哪個版本上, 和誰承諾它?
我們與客戶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