2017-02-12 167 views
1

我从Retrieve specific commit from a remote Git repository知道可以从远程git存储库提取特定的提交。如何使用JGit获取特定提交

但是,试图从JGit这样做,它是失败的。对于同一个存储库,当我从终端运行git fetch origin 57eab609d9efda3b8ee370582c3762c0e721033d:HEAD时,我想要的提交(及其所有祖先)从远程存储库中获取。然而,当我运行使用JGit下面,我得到一个异常:

RefSpec refSpec = new RefSpec() 
    .setSourceDestination(commitId, HEAD) 
    .setForceUpdate(true); 
refs = Lists.newArrayList(refSpec); 
git.fetch().setRemote(GIT_REMOTE_NAME) 
    .setTimeout(REMOTE_FETCH_TIMEOUT) 
    .setTransportConfigCallback(transportConfigurer) 
    .setCredentialsProvider(gitCredentials) 
    .setTagOpt(TagOpt.FETCH_TAGS) 
    .setRefSpecs(refs) 
    .call(); 

唯一的例外是org.eclipse.jgit.errors.TransportException: Remote does not have 57eab609d9efda3b8ee370582c3762c0e721033d available for fetch.

回答

2

使用Git瓷命令,你只能取裁判,而不是具体的提交。另请参阅:Fetch specific commit from remote git repo

您引用的帖子仅解释如何从远程获取特定参考(refs/remotes/origin/branch)。我看不到一个特定的提交(不是由ref引用)提取的地方。

这同样适用于JGit:FetchCommand需要给予refspec(因此名称为setRefSpecs())才能从中获取。有了这些信息,JGit将获取refspec指向的提交及其所有祖先。

+0

嗯,我想设置'RefSpec',但JGit无法找到它,因为它是'RevCommit'的SHA,而不是分支或标签的'RefSpec'。但是,使用正常的git命令,我可以根据原始问题获取特定的提交SHA。我查看了'FetchProcess'的代码,它确实调用'conn.getRef(spec.getSource())',它只看'advertisedRefs',所以看起来它并没有在JGit中实现 –

+0

还有一个事情,你引用的问题的接受答案是从2014年。根据http://stackoverflow.com/a/30701724/552396,似乎我在我的问题中描述的功能是在2015年实施的,它的描述很好在我的问题开始时提到的问题。我真的希望它在JGit中实现。将尝试发送到开发邮件列表,看看是否有计划。 –

+1

感谢您指出这一点。我假设JGit的低层API可以用来获取某些提交,但是FetchCommand目前还不支持。 –