2012-10-17 13 views
15

Ich benutze JGit, um eine Remote-Tracking-Zweigstelle auszuchecken.JGit: Auschecken einer Remote-Zweigstelle

Git binrepository = cloneCmd.call() 

CheckoutCommand checkoutCmd = binrepository.checkout(); 
checkoutCmd.setName("origin/" + branchName); 
checkoutCmd.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK); 
checkoutCmd.setStartPoint("origin/" + branchName); 

Ref ref = checkoutCmd.call(); 

Die Dateien sind ausgecheckt, aber der HEAD zeigt nicht auf den Zweig. Im Anschluss an die git status Ausgang,

$ git status 
# Not currently on any branch. 
nothing to commit (working directory clean) 

Die gleiche Operation kann in git Befehlszeile ausgeführt werden, einfach und es funktioniert,

git checkout -t origin/mybranch 

Wie diese JGit zu tun?

Antwort

19

Sie setCreateBranch verwenden müssen sehen, einen Zweig zu erstellen:

Ref ref = git.checkout(). 
     setCreateBranch(true). 
     setName("branchName"). 
     setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK). 
     setStartPoint("origin/" + branchName). 
     call(); 

Ihr erster Befehl war das Äquivalent von git checkout origin/mybranch.

(Edit: legte ich einen Patch JGit die Dokumentation von CheckoutCommand zu verbessern: https://git.eclipse.org/r/8259)

+0

Ich habe es versucht. Es klappt. Es ist eine einfache Lösung. Ich muss eine Änderung vornehmen, commit und Push an Remote. Ich werde das testen und den Thread aktualisieren. – Nambi

+0

Viel komplette Antwort als meine. +1 – VonC

+0

Der obige Code funktioniert nicht mit Git-Tags, Rechte? –

4

Wie im Code von CheckoutCommand gezeigt, müssen Sie die boolean createBranch zu true setzen, um einen lokalen Zweig zu erstellen.

Sie können ein Beispiel in CheckoutCommandTest - testCreateBranchOnCheckout()

@Test 
public void testCreateBranchOnCheckout() throws Exception { 
    git.checkout().setCreateBranch(true).setName("test2").call(); 
    assertNotNull(db.getRef("test2")); 
} 
+0

Gute Idee zu verknüpfen Fällen zu testen, +1 :) – robinst

3

Aus irgendeinem Grund, den Code, der geschrieben robinst nicht für mich arbeiten. Insbesondere hat der lokale Zweig, der erstellt wurde, den Remote-Zweig nicht verfolgt. Dies ist, was ich verwenden, dass für mich gearbeitet (mit JGit 2.0.0.201206130900-r):

git.pull().setCredentialsProvider(user).call() 
git.branchCreate().setForce(true).setName(branch).setStartPoint("origin/" + branch).call(); 
git.checkout().setName(branch).call() 
+0

Dies sollte als Antwort akzeptiert werden. Andere zwei Lösungen funktionieren nicht. –

1

Sie auch dieser wie können

git.checkout().setName(remoteBranch).setForce(true).call(); 
       logger.info("Checkout to remote branch:" + remoteBranch); 
       git.branchCreate() 
        .setName(branchName) 
        .setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM) 
        .setStartPoint(remoteBranch) 
        .setForce(true) 
        .call(); 
       logger.info("create new locale branch:" + branchName + "set_upstream with:" + remoteBranch); 
       git.checkout().setName(branchName).setForce(true).call(); 
       logger.info("Checkout to locale branch:" + branchName);