如何查找git子模块的分支名称?

时间:2019-09-17 09:48:53

标签: java git jgit

我有一个git存储库,其中包含一个子模块,并且已加载到我的本地沙箱中。

在将子模块更新为远程存储库也指向的最新提交之后,我想找到其最新提交SHA1和子模块分支名称。

在尝试获取已加载子模块的branchName时,代码始终返回其SHA1而不是名称。

// Method to find the localHeadCommit
public RevCommit fetchLocalHeadCommit(final String gitSubmoduleRootFolderPath) throws IOException {
try (Git gitSubmodule = Git.open(new File(resolveRootFolderPath(gitSubmoduleRootFolderPath)))) {
  Repository repository = gitSubmodule.getRepository();
  ObjectId localHeadObjId = repository.resolve("HEAD");
  try (RevWalk revWalk = new RevWalk(repository, 0)) {
    return revWalk.parseCommit(localHeadObjId);
  }
}

 // Method to find the submoduleBranchName
public String fetchBranchNameOfSubmodule(final String gitRootFolderPath) throws IOException {
 return fetchLocalHeadCommit(gitRootFolderPath).getName();
}


I expect the output of fetchBranchNameOfSubmodule() to be   
feature/SubmodulebrachName , but the actual output is 
4f8664429af63c0309c0f063436b911845e3d3a43

1)我们还有其他选择可以找到本地加载的子模块的branchName吗?

2)另外,如果多个分支指向同一个commitId,如何查找branchName?

1 个答案:

答案 0 :(得分:0)

  

在尝试获取已加载子模块的分支名称时,代码始终返回其SHA1而不是名称

在使用子模块时,git签出SHA-1,您所处的模式称为detached HEAD

有几种方法可以跟踪子模块当前指向哪个分支,最简单的方法是使用给定的分支创建子模块(告诉子模块跟踪所需的分支)

### Track specific branch
git submodule add -b <branch name> <url>
  

此外,如果多个分支指向同一提交,如何查找分支名称?

基本上,您在detached HEAD中(建议阅读此答案以了解什么是detached HEADHow to move HEAD back to a previous location? (Detached head) & Undo commits

在分离式HEAD中,提交是来自分支还是来自标记都无所谓,因为git只关心内容。

不会有太大帮助,但是您可以使用git contains <SHA-1>来获取包含此提交的分支列表。