2017-08-09 1 views
0

Mit normalen git checkout funktioniert der Befehl genau so, wie ich es erwarten würde. Hier sind die Anwendungsfälle ich mit dem gleichen Stück Code, damit ich versuche:Wie kann man einen entfernten Zweig auschecken, ohne zu wissen, ob er lokal in JGit existiert?

1) git checkout branchname wo branchname nicht lokal vorhanden ist, aber tut auf Remote-

2) git checkout branchname wo branchname bereits lokal vorhanden

3) git checkout commitid

Für Zusammenhang hat das Repository vorher geklont worden, wie folgt:

repo = Git.cloneRepository() 
    .setCloneSubmodules(true) 
    .setURI(repoUrl) 
    .setDirectory(createTempDir()) 
    .setCloneAllBranches(true) 
    .call(); 

Der standardmäßige JGit checkout-Befehl erstellt die Verzweigungen nicht automatisch lokal. Das folgende Stück Code funktioniert für Szenarien 2 und 3:

repo.checkout() 
     .setName(branchOrCommitId) 
     .call(); 

Mit der Änderung einen neuen Zweig erstellen es funktioniert nur mit Szenario 1:

repo.checkout() 
     .setCreateBranch(true) 
     .setName(branchOrCommitId) 
     .call(); 

Gibt es eine saubere Lösung für dieses Problem, das ich kann verwenden, unter Berücksichtigung der Standard-Git CLI bietet bereits die automatische Funktionalität in dem Befehl, den ich suche?

+0

Ich habe genau das gleiche Anforderung. Was hast du am Ende gemacht? –

Antwort

0

Eine mögliche Lösung dieses Problems die ich bisher gefunden habe, ist zu prüfen, ob die lokale Niederlassung existiert und eine ID, um die beiden Ansätze in der Frage erwähnt zu kombinieren:

boolean createBranch = !ObjectId.isId(branchOrCommitId); 
    if (createBranch) { 
     Ref ref = repo.getRepository().exactRef("refs/heads/" + branchOrCommitId); 
     if (ref != null) { 
      createBranch = false; 
     } 
    } 
    repo.checkout() 
      .setCreateBranch(createBranch) 
      .setName(branchOrCommitId) 
      .call(); 
+0

Der CLI 'git checkout'-Befehl versucht nur, den Namen als Zweigname zu verwenden (versucht, ihn durch Hinzufügen von' refs/heads/'zu einem ref it aufzulösen), und wenn dies fehlschlägt, scannt er alle refs/remotes /' references für alle Fernbedienungen, um zu sehen, ob Subtrahieren von 'refs/remotes /' plus dem entfernten Namen übereinstimmt. Wenn das Ergebnis des Scans genau 1 'refs/remotes /' name ist, verhält es sich dann wie folgt: git checkout -b --track '. Ihr Code oben ist nicht ganz derselbe: Was passiert, wenn es 0 oder 2 oder mehr Übereinstimmungen gibt? – torek

Verwandte Themen