2017-02-12 168 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目前還不支持。 –