2014-09-24 74 views
2

我們與客戶gitolite服務器的自定義應用得到的裸庫子模塊哈希

每一個應用程序有一個子模塊「庫/芯」是指我們的基本應用。

我們現在想要創建一個儀表板,顯示我們所有的客戶應用程序以及核心所在的版本。

gitolite將所有內容都存儲在磁盤上的裸存儲庫中,並且儀表板應用程序直接訪問repos /或使用ssh密鑰(如果更容易)。

我的問題是,我將如何從裸倉庫找出子模塊在哪個版本上, 和誰承諾它?

回答

1

可以列出.gitmodules找出哪些路徑被認爲是模塊,然後通過他們去找出什麼<module>.git/HEAD/引用指向(可能是一個象徵性的參考,像ref: refs/heads/master,這你再有以鏈發現價值refs/heads/master)。這會給你最近的那個模塊的提交散列。

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其包括頭部的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

1

我只是實現這個的CI服務器。棘手的部分是保持裸露結賬。

我的解決辦法如下:

1)git show HEAD:.gitmodules可以用來獲得的其是子模塊的路徑列表。每個path =

2),這第三個字段可以用來確定SHA子模塊是:

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

+0

這是與裸倉庫合作的唯一答案。獎金:它不需要任何東西比混帳。 – 2018-02-01 16:07:22