2017-02-12 1 views
1

Ich weiß aus Retrieve specific commit from a remote Git repository, dass es möglich ist, ein bestimmtes Commit von einem Remote-Git-Repository abrufen.Wie bekomme ich einen bestimmten Commit mit JGit

Wenn Sie dies jedoch von JGit aus versuchen, schlägt es fehl. Wenn ich für dasselbe Repository git fetch origin 57eab609d9efda3b8ee370582c3762c0e721033d:HEAD vom Terminal aus starte, wird das gewünschte Commit (mit allen seinen Vorfahren) aus dem Remote-Repository abgerufen. Allerdings, wenn ich die folgende Verwendung JGit laufen, ich eine Ausnahme erhalten:

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(); 

Die Ausnahme org.eclipse.jgit.errors.TransportException: Remote does not have 57eab609d9efda3b8ee370582c3762c0e721033d available for fetch.

Antwort

2

Mit Git Porzellan Befehle ist, können Sie nur Refs holen, nicht spezifisch Commits. Siehe auch hier: Fetch specific commit from remote git repo

Der Beitrag, auf den Sie sich beziehen, erklärt nur, wie man eine bestimmte Ref (refs/remotes/origin/branch in dem gegebenen Beispiel) von einer Fernbedienung holt. Ich kann nicht sehen, wo ein bestimmter Commit (der nicht durch einen Verweis bezeichnet wird) abgerufen wird.

Das gleiche gilt für JGit: die FetchCommand müssen eine refspec erhalten (daher der Name setRefSpecs()) von holen. Mit dieser Information holt JGit das Commit, auf das der refspec zeigt, und alle seine Vorfahren.

+0

Nun, ich versuche die 'RefSpec' zu setzen, aber JGit kann sie nicht finden, da es die SHA des' RevCommit' ist, nicht die 'RefSpec' einer Verzweigung oder eines Tags. Mit normalem git-Befehl kann ich jedoch mit spezifischem commit SHA wie bei der ursprünglichen Frage abrufen. Ich schaute auf den Code von 'FetchProcess', und es ruft' conn.getRef (spec.getSource()) 'auf, das nur auf die' beworbenenRefs' schaut, so scheint es, dass es nicht in JGit schließlich –

+0

Ein mehr implementiert wird Die akzeptierte Antwort auf die Frage, auf die Sie verwiesen haben, stammt aus dem Jahr 2014. Laut http://stackoverflow.com/a/30701724/552396 scheint es, dass die Funktionalität, die ich in meiner Frage beschrieben habe, im Jahr 2015 implementiert wurde, und es ist gut in beschrieben die Frage, auf die ich zu Beginn meiner Frage hingewiesen habe. Ich wünschte wirklich, dass es in JGit implementiert wurde. Wird versuchen, an die Mailingliste von Dev zu senden, um zu sehen, ob es Pläne dafür gibt. –

+1

Vielen Dank, dass Sie darauf hingewiesen haben. Ich nehme an, dass die Low-Level-APIs von JGit verwendet werden können, um bestimmte Commits abzurufen, der FetchCommand unterstützt dies jedoch noch nicht. –

Verwandte Themen