Ich habe Githubs Beitrag über Git-Worktree gelesen . Sie schreiben:
Angenommen, Sie arbeiten in einem Git-Repository in einem Zweig namens "
feature
, wenn ein Benutzer einen Fehler mit hoher Dringlichkeit meldetmaster
." Zuerst erstellen Sie einen verknüpften Arbeitsbaum mit einem neuen Zweig, derhotfix
relativ zum Master ausgecheckt ist. […] Sie können den Fehler beheben, einen Hotfix drücken und eine Pull-Anforderung erstellen.
Wenn ich an einem Zweig namens "Feature" arbeite und ein Fehler mit hoher Dringlichkeit im Master gemeldet wird, verstecke ich normalerweise alles, woran ich arbeite, und erstelle einen neuen Zweig. Wenn ich fertig bin, kann ich weiterarbeiten. Dies ist ein sehr einfaches Modell, ich arbeite seit Jahren so.
Auf der anderen Seite hat die Verwendung von git-worktree seine eigenen Einschränkungen:
Beispielsweise darf nicht derselbe Zweig gleichzeitig in zwei verknüpften Arbeitsbäumen ausgecheckt werden, da dadurch Änderungen an einem Arbeitsbaum vorgenommen werden können, um den anderen Zweig nicht mehr synchron zu halten.
Warum sollte ich für ein bereits gelöstes Problem einen komplizierteren Workflow wählen?
Gibt es etwas git-worktree
, das nicht im Voraus getan werden konnte und das diese ganz neue, komplexe Funktion rechtfertigt?
quelle
Antworten:
Git Worktree ist für mich die größte Verbesserung seit langer Zeit. Ich arbeite in der Entwicklung von Unternehmenssoftware. Dort ist es sehr häufig, dass Sie alte Versionen beibehalten müssen, wie Sie sie vor 3 Jahren veröffentlicht haben. Natürlich haben Sie für jede Version einen Zweig, damit Sie einfach darauf wechseln und einen Fehler beheben können. Das Wechseln ist jedoch teuer, da Sie in der Zwischenzeit das Repository vollständig umstrukturiert und möglicherweise ein System erstellt haben. Wenn Sie wechseln, wird Ihre IDE verrückt und versucht, die Projekteinstellungen anzupassen.
Mit worktree können Sie diese ständige Neukonfiguration vermeiden. Überprüfen Sie diese alten Zweige mithilfe von Arbeitsbaum in separaten Ordnern. Für jeden Zweig haben Sie ein unabhängiges IDE-Projekt.
Natürlich hätte dies in der Vergangenheit durch mehrmaliges Klonen des Repos geschehen können, und dies war bisher mein Ansatz. Dies bedeutete jedoch auch, Platz auf der Festplatte zu verschwenden und noch schlimmer, die gleichen Änderungen mehrmals aus dem Repo abzurufen.
quelle
.git
Verzeichnis. Mit vielen lokalen Klonen aus dem Upstream haben Sie viele lokale Kopien derselben Datenbank, da jeder Klon eine eigene.git
Datenbank hat. Bei vielen lokalen Arbeitsbäumen verwendet jeder Baum dieselbe.git
Datenbank. Ja, wenn Sie lokale Klone Ihres lokalen Arbeitsbaums haben, verknüpft Git viele der .git-Inhalte fest, jedoch nicht unter Windows.Ich kann einige Verwendungszwecke dafür sehen.
Wenn Sie eine Testsuite haben, die lange läuft, stellen Sie sich Stunden vor, und Sie starten sie. Sie blockiert diese Arbeitskopie effektiv, bis die Tests abgeschlossen sind. Das Wechseln der Zweige während dieser Tests würde sie auf eine Weise zerstören, die schwer zu verstehen wäre.
Mit
git-worktree
könnte ich also eine zweite Idee für eine andere Niederlassung haben, die dort arbeitet.Wenn ich zu einem anderen Zweig wechsle, um eine schnelle Untersuchung durchzuführen, glaubt meine IDE, dass sich viele Dateien plötzlich geändert haben, und indiziert alle diese Änderungen, nur um sie beim Zurückschalten erneut indizieren zu müssen.
Ein dritter Anwendungsfall wäre der Dateivergleich mit anderen Tools als
git-diff
normaldiff
zwischen zwei Verzeichnissen, wenn zwei Zweige vorhanden sind.quelle
git clone
für alle gut funktionieren?git clone --reference
. Die Verwaltung aller anderen Zweige erfolgt nur einmal statt einmal pro Arbeitsverzeichnis.Eine naheliegende Verwendung besteht darin, gleichzeitig das Verhalten (nicht die Quelle) verschiedener Versionen zu vergleichen - beispielsweise verschiedene Versionen einer Website oder nur einer Webseite.
Ich habe das vor Ort ausprobiert.
Erstellen Sie ein Verzeichnis
page1
.innerhalb erstellen Sie das Verzeichnis
src
undgit init
es.in
src
erstellenpage1.html
mit ein wenig Inhalt und festschreiben.$ git branch ver0
$ git worktree add ../V0 ver0
Fügen Sie im
src
Master mehr Text hinzupage1.html
und schreiben Sie ihn fest.$ git branch sty1
bearbeiten
page1.html
in dersty1
Verzweigung (fügen Sie einen bestimmten CSS-Stil hinzu) und fügen Sie Commit hinzu.$ git worktree add ../S1 sty1
Sie können jetzt einen Webbrowser verwenden, um diese drei Versionen gleichzeitig zu öffnen und anzuzeigen:
..\page1\src\page1.html
// was auch immer git als aktuell hat..\page1\V0\page1.html
// die ursprüngliche Version..\page1\S1\page1.html
// die experimentell gestaltete Versionquelle
branch
; Die Antwort ist auch die gleiche: Es ist leichter und für den Job gebaut.Es gibt legitime Gründe, warum Sie möglicherweise mehrere Arbeitsbäume gleichzeitig im Dateisystem haben möchten / müssen.
Bearbeiten der ausgecheckten Dateien, während Änderungen an einer anderen Stelle vorgenommen werden müssen (z. B. Kompilieren / Testen)
Differenzieren der Dateien über normale Diff-Tools
Während Zusammenführungskonflikten möchte ich häufig durch den Quellcode navigieren, da er sich auf der Quellseite befindet, während Konflikte in den Dateien gelöst werden.
Wenn Sie häufig hin und her wechseln müssen, wird Zeit für das Auschecken und erneute Auschecken verschwendet, sodass Sie nicht mit mehreren Arbeitsbäumen arbeiten müssen.
Die mentalen Kosten des mentalen Kontextwechsels zwischen Zweigen durch Git-Stashing sind nicht wirklich messbar. Einige Leute stellen fest, dass das Verstecken mentale Kosten verursacht, die nicht vorhanden sind, indem sie einfach Dateien aus einem anderen Verzeichnis öffnen.
Einige Leute fragen "warum nicht mehrere lokale Klone machen". Es ist richtig, dass Sie sich mit dem Flag "--local" keine Gedanken über die zusätzliche Nutzung des Speicherplatzes machen müssen. Dies (oder ähnliche Ideen) habe ich bis jetzt getan. Funktionale Vorteile verknüpfter Arbeitsbäume gegenüber lokalen Klonen sind:
Bei lokalen Klonen haben Ihre zusätzlichen Arbeitsbäume (die sich in den lokalen Klonen befinden) einfach keinen Zugriff auf den Ursprung oder die vorgelagerten Zweige. Der 'Ursprung' im Klon ist nicht der gleiche wie der 'Ursprung' im ersten Klon.
git log @{u}..
odergit diff origin/feature/other-feature
kann sehr hilfreich sein und diese sind entweder nicht mehr möglich oder schwieriger. Diese Ideen sind mit lokalen Klonen über eine Reihe von Workarouns technisch möglich, aber jede Workaround, die Sie durchführen können, wird durch verknüpfte Arbeitsbäume besser und / oder einfacher.Sie können Refs zwischen Arbeitsbäumen teilen. Wenn Sie Änderungen von einer anderen lokalen Niederlassung vergleichen oder ausleihen möchten, können Sie dies jetzt tun.
quelle
tl; dr: Jedes Mal, wenn Sie aus irgendeinem Grund zwei Arbeitsbäume gleichzeitig auschecken lassen möchten,
git-worktree
ist dies eine schnelle und platzsparende Möglichkeit.Wenn Sie einen anderen Arbeitsbaum erstellen, werden die meisten Teile des Repos (dh
.git
) gemeinsam genutzt. Wenn Sie also einen Zweig erstellen oder Daten abrufen, während Sie sich in einem Arbeitsbaum befinden, können Sie auch von anderen Arbeitsbäumen darauf zugreifen. Angenommen, Sie möchten Ihre Testsuite auf Branch Foo ausführen, ohne sie irgendwohin verschieben zu müssen, um sie zu klonen, und Sie möchten den Aufwand vermeiden, Ihr Repo lokal zu klonen. Diesgit-worktree
ist eine gute Möglichkeit, nur eine neue Kasse eines bestimmten Status in einem zu erstellen vorübergehender Ort, entweder vorübergehend oder dauerhaft. Genau wie bei einem Klon müssen Sie ihn nur löschen, wenn Sie damit fertig sind, und der Verweis darauf wird nach einiger Zeit durch Müll gesammelt.quelle
--force
. Es ist jedoch unpraktisch, wenn Sie den Zweig an einer Stelle aktualisieren und damit rechnen, an einer anderen Stelle daran zu arbeiten, da der Arbeitsbaum nicht aktualisiert wird.origin/master
..git
Datei im separaten Arbeitsbaum ist eine Textdatei, die den Pfad zu ihrer Konfiguration enthält, die sich im ursprünglichen Repository befindet.git checkout --ignore-other-worktrees <branch>
git-scm.com/docs/git-checkout/…Ich bin ursprünglich auf diese Frage gestoßen, nachdem ich mich gefragt hatte, wofür diese ausgefallenen Arbeitsbäume verwendet werden könnten. Seitdem habe ich sie in meinen Workflow integriert und finde sie trotz meiner anfänglichen Skepsis sehr nützlich.
Ich arbeite an einer ziemlich großen Codebasis, deren Kompilierung einige Zeit in Anspruch nimmt. Normalerweise habe ich den aktuellen Entwicklungszweig auf meinem Computer zusammen mit dem Feature-Zweig, an dem ich gerade arbeite, sowie dem Hauptzweig, der den aktuellen Status des Live-Systems darstellt.
Einer der größten Vorteile für mich ist natürlich, dass ich nicht jedes Mal, wenn ich die Zweige wechsle (dh Arbeitsbäume), das Ganze neu kompilieren muss. Ein netter Nebeneffekt ist, dass ich zum Entwicklungs-Arbeitsbaum gehen, dort Dinge erledigen, das Verzeichnis für meinen aktuellen Feature-Zweig in den Arbeitsbaum ändern und ihn dann neu starten kann, ohne vorher ziehen zu müssen.
quelle
Ich habe eine ziemlich ungewöhnliche: Ich mache Windows- und Linux-Entwicklung auf demselben Computer . Ich habe eine VirtualBox unter Linux in meiner Windows-Box. Die VirtualBox stellt einige Windows-Verzeichnisse bereit und verwendet sie direkt im Linux-Computer. Auf diese Weise kann ich Windows zum Verwalten von Dateien verwenden, aber unter Linux erstellen. Dies ist ein plattformübergreifendes Projekt, das sowohl auf Windows als auch auf Linux aus derselben Verzeichnisstruktur aufbaut.
Das Problem ist, dass die Linux- und Windows-Build-Systeme bei Verwendung im selben Verzeichnis ineinander stoßen. Es gibt einige komplizierte Erstellungsschritte zum Herunterladen von Bibliotheken usw., die dieselben Verzeichnisnamen verwenden. Die Windows-Version des Build-Systems lädt die Windows-spezifischen Bibliotheken herunter, und die Linux-Version des Build-Systems lädt die Linux-spezifischen Bibliotheken herunter.
In einer idealen Welt würde das Build-System so modifiziert, dass Windows und Linux innerhalb des Verzeichnisses nebeneinander existieren können. Derzeit wird das Problem jedoch mit Arbeitsbäumen behoben. Der Ordner "Linux" kann Linux-spezifische Build-Artefakte generieren, und der Ordner "Windows" kann Windows-spezifische Build-Artefakte generieren. Dies ist zwar kaum eine ideale Lösung, bietet jedoch eine gute Lücke, während darauf gewartet wird, dass die Fehler im Build-System behoben werden.
Zugegeben, der Arbeitsbaum war nicht dafür ausgelegt; Ich muss die Windows-Version und die Linux-Version in getrennten Zweigen aufbewahren, obwohl ich es wirklich vorziehen würde, wenn sie sich in demselben Zweig befinden. Trotzdem macht es den Job und ist ein etwas unkonventioneller Fall von Arbeitsbaum, der den Tag rettet.
quelle
In einem neuen Projekt für mich habe ich eine Funktion erstellt. Einige Spezifikationen sind jedoch fehlgeschlagen. Um die Ergebnisse mit zu vergleichen, habe
master
ich einwork-tree
Repo erstellt. Ich habe die Ergebnisse Schritt für Schritt im Ausführungscode verglichen, bis ich verstanden habe, was schief gelaufen ist.quelle
Ich benutze
git worktree
für die Entwicklung des maschinellen Lernens.Ich habe einen Hauptfunktionscode und möchte dann Zweige verschiedener Experimente (verschiedene Algorithmen und verschiedene Hyperparameter) aufteilen.
git worktree
ermöglicht es mir, dvc neben verschiedenen Versionen meines Codes zu integrieren, die auf verschiedene Algorithmen spezialisiert sind. Nachdem ich alle Schulungsjobs ausgeführt habe, bewerte ich die endgültigen Metriken und füge sie zusammen, um den besten Zweig / das beste Modell zu meistern.quelle