wake-up-neo.net

Git fügt einen Arbeitsbaum aus einem vorhandenen Remote-Zweig hinzu

Ich bin neu bei Git. Ich suche viel, aber es wurde nichts gefunden, das genau zu meinem Fall passt.

Ich habe eine persönliche WinForms-Anwendung und in meinem Remote-Repo gibt es 3 Niederlassungen (Master- und 2 Langlauf-Niederlassungen):

master  #the common features are here like Core, DAL,...
north   #customized for A company (long-running)
razavi  #customized for B company (long-running)

An meinem Büro-PC füge ich 2 worktree für diese north- und razavi-Zweige hinzu:

$ git worktree list
C:/Source/nis     a6fb6e1 [master]
C:/Source/north   ebc7670 [north]
C:/Source/razavi  eed08a2 [razavi]

Bis jetzt ist alles in Ordnung, ich beschließe, auch von zu Hause aus an diesem Projekt zu arbeiten, aber wenn ich versuche, in diesen beiden Zweigen einen Arbeitsbaum hinzuzufügen, gibt es einen Fehler:

$git worktree add -b north ../north north
fatal: A branch named 'north' already exists.

Ich entferne den -b-Schalter, um keinen neuen Zweig hinzuzufügen, aber es funktioniert auch nicht.

Wie kann ich eine worktree aus einem vorhandenen Zweig hinzufügen, der nicht lokal, sondern entfernt ist?

UPDATE (Lösung)

Nach einiger Zeit fand ich die Lösung für mein Problem. Eigentlich war es ein --checkout-Schalter, der fehlte:

$ git worktree add --checkout ../north north

Ich werde das auch in Antworten geben.

8
vaheeds

TL; DR: Sie wollten wahrscheinlich git worktree add ../north north

Zunächst eine Erinnerung (oder Information für andere, die auf diese Frage stoßen): git worktree add Möchte einen neuen Arbeitsbaum erstellen und , um Stellen Sie gleichzeitig sicher, dass in diesem neuen Arbeitsbaum ein anderer Zweigname als in jedem anderen Arbeitsbaum verwendet wird. Dies liegt daran, dass, während jeder hinzugefügte Arbeitsbaum seinen eigenen Index und HEAD hat, die HEAD -Dateien gemeinsam genutzt werden die zugrunde liegenden Verzweigungszeiger im gemeinsam genutzten Repository. Das Vorhandensein von zwei verschiedenen Arbeitsbäumen mit unabhängigen Indexobjekten, aber demselben zugrunde liegenden Zweig, führt zu einigen schwierigen Problemen für die Benutzer. Anstatt zu versuchen, herauszufinden , wie mit diesen umzugehen ist - indem man entweder Programmierer ausbildet oder Werkzeuge bereitstellt, um mit den Problemen umzugehen - einfach git worktree verbietet die Situation völlig.

Daher ist es ziemlich typisch, beim Erstellen eines neuen Arbeitsbaums einen neuen Zweignamen erstellen zu wollen. Per Definition unterscheidet sich ein neuer Filialname automatisch von jedem vorhandenen Filialnamen:

$ git checkout -b newbranch
Switched to a new branch 'newbranch'
$ git checkout -b newbranch
fatal: A branch named 'newbranch' already exists.

Das scheint ganz natürlich: Niemand wird jemals davon überrascht.

Sie führen git worktree add Auf eine Weise aus, die der von git checkout -b Entspricht, mit der Ausnahme, dass das Auschecken im neu hinzugefügten Arbeitsbaum erfolgt. Sie haben jedoch bereits einen Zweig mit dem Namen north.

Wenn dieser vorhandene Zweig north nicht nützlich ist, können Sie ihn löschen. Jetzt haben Sie keinen lokalen Zweig mit dem Namen north und können einen neuen erstellen.

Wenn diese vorhandene north-Verzweigung nützlich ist , löschen Sie sie nicht! Wenn es in einem vorhandenen Arbeitsbaum bereits ausgecheckt ist, wechseln Sie zu diesem Arbeitsbaum und bearbeiten Sie ihn dort. Wenn in einem vorhandenen Arbeitsbaum nicht ausgecheckt ist, können Sie einen neuen Arbeitsbaum erstellen, der habe es ausgecheckt; Sie müssen lediglich die Verwendung des Flags -b (und des entsprechenden Zweignamens) vermeiden:

git worktree add ../north north

Beachten Sie, dass Sie sich beim Erstellen eines neuen Zweigs nicht wiederholen müssen:

git worktree add -b newbranch ../path

erstellt einen neuen Arbeitsbaum in ../path und füllt ihn mit git checkout -b newbranch auf. Sie benötigen den Filialnamen nur, wenn:

  1. sie verwenden nicht -b und
  2. das Argument path endet nicht mit dem Namen der Verzweigung.

Wenn Sie beispielsweise den vorhandenen Zweig zorg in einem neuen Arbeitsbaum im Pfad ../zorg Auschecken möchten, können Sie Folgendes ausführen:

git worktree add ../zorg

Da es hier weder ein -b zorg Noch ein abschließendes Argument gibt, berechnet Git den Zweignamen mithilfe des letzten Teils von ../zorg, Der natürlich nur zorg ist Dadurch wird versucht, den vorhandenen Zweig zorg in den neuen Arbeitsbaum auszuchecken.

8
torek

Zusätzlich zum "Erraten des entfernten Zweigs", wie ich in meiner anderen Antwort erkläre , wird Git 2.18 (Q2 2018) eine neue Funktion bieten:
"git worktree add" hat gelernt, einen vorhandenen Zweig auszuchecken.

Siehe commit f60a7b7 , commit 6427f87 , commit 2c27002 , commit d861d34 (24. April 2018) von Thomas Gummerer (tgummerer) .
Geholfen hat: Eric Sunshine (sunshineco) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Commit 10174da , 23. Mai 2018)

worktree: "add" beibringen, um vorhandene Zweige zu überprüfen

Derzeit erstellt 'git worktree add <path>' einen neuen Zweig mit dem Namen Basisname des Pfads standardmäßig.
Wenn bereits eine Verzweigung mit diesem Namen vorhanden ist, lehnt der Befehl nichts ab, es sei denn, die Option '--force' ist angegeben.

Wir können jedoch ein bisschen besser als das, und check die Verzweigung, wenn es wird nirgendwo anders ausgecheckt.
Dies wird Benutzern helfen, die einen vorhandenen Zweig in einen neuen Arbeitsbaum
einchecken möchten, und einige Tastenanschläge speichern.

Als aktuelles Verhalten wird einfach "die()" bezeichnet, wenn ein Zweig mit dem Namen der Basisname des Pfads ist bereits vorhanden, es gibt keine Rückwärtsrichtung Kompatibilitätsprobleme hier.

Wir werden immer noch "die()" sein, wenn der Zweig in einem anderen Worktree ausgecheckt wird es sei denn, das --force-Flag wird übergeben.

Die Dokumentation sagt jetzt :

$ git worktree add --track -b <branch> <path> <remote>/<branch>

Wenn <commit-ish> weggelassen wird und weder -b noch -B noch --detach verwendet wird, Dann wird der Bequemlichkeit halber der neue Arbeitsbaum einem Zweig zugeordnet (nennen Sie es <branch>) benannt nach $(basename <path>)

  • Wenn <branch> nicht vorhanden ist, wird automatisch ein neuer Zweig auf der Basis von HEAD erstellt, als wäre -b <branch> gegeben. 
  • Wenn <branch> vorhanden ist, wird es im neuen Arbeitsbaum ausgecheckt, wenn es nicht an anderer Stelle ausgecheckt ist. Andernfalls lehnt der Befehl die Erstellung des Arbeitsbaums ab (es sei denn, --force wird verwendet).
2
VonC

Für dieses Problem benötigt worktree add einen --checkout-Schalter, um dies zu tun:

$ git worktree add --checkout ../north north
$ git worktree add --checkout ../razavi razavi
1
vaheeds

Zusätzlich zu git worktree add --checkout schlägt Git 2.16 (Q1 2018) eine weitere Alternative vor:

Die Art und Weise "git worktree add" bestimmt, welcher Zweig von wo erstellt werden soll und ob der Checkout im neuen Arbeitsbaum ein wenig aktualisiert wurde.

Siehe commit e92445a , commit 71d6682 (29 Nov 2017) und commit 4e85333 , commit e284e89 , commit c4738ae , commit 7c85a87 (26 November 2017) von Thomas Gummerer (tgummerer) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in commit 66d3f19 , 19 Dez 2017)

hinzufügen der Option worktree.guessRemote config

Einige Benutzer möchten möglicherweise die --guess-remote-Option in .__ eingeführt haben. Das vorherige Festschreiben ist standardmäßig aktiviert, sodass sie nicht ausgegeben werden müssen Jedes Mal erstellen sie einen neuen Arbeitsbaum.

Fügen Sie eine Konfigurationsoption worktree.guessRemote hinzu, mit der Benutzer .__ konfigurieren können. das Standardverhalten für sich.

Die Dokumentation für git config lautet nun:

worktree.guessRemote::

Wenn mit add kein Verzweigungsargument und weder -b noch -B noch --detach angegeben sind, erstellt der Befehl standardmäßig eine neue Verzweigung aus HEAD.
Wenn worktree.guessRemote auf true gesetzt ist, versucht worktree add, einen Remote-Tracking-Zweig zu finden, dessen Name eindeutig mit dem neuen Zweignamen übereinstimmt. 

  • Wenn ein solcher Zweig vorhanden ist, wird er ausgecheckt und als "Upstream" für den neuen Zweig festgelegt. 
  • Wenn keine solche Übereinstimmung gefunden werden kann, wird auf das Erstellen eines neuen Zweigs aus dem aktuellen HEAD zurückgegriffen.

Tatsächlich verdeutlicht Git 2.21 (Q1 2019) die Dokumentation für diese Option, die direkt mit "With add" eingesprungen wurde, ohne zu erklären, dass add ein Unterbefehl von "git worktree" ist.

Siehe commit b4583d5 (23. Dezember 2018) von Eric Sunshine (sunshineco) .
(Zusammengeführt von Eric Sunshine - sunshineco - in commit b4583d5 , 28. Dezember 2018)

Die Dokumentation liest jetzt:

worktree.guessRemote:

Wenn keine Verzweigung angegeben ist und weder -b noch -B noch --detach verwendet wird, erstellt git worktree add standardmäßig die Erstellung einer neuen Verzweigung aus HEAD. 

1
VonC