Ich bin mir nicht sicher, ob dies von Git unterstützt wird, aber theoretisch scheint es mir zu funktionieren.
In meinem Workflow werden häufig Dateien in mehreren Zweigen gleichzeitig bearbeitet. Mit anderen Worten, ich möchte oft ein paar Dateien in einem Zweig öffnen, während ich den Inhalt einer anderen Datei in einem anderen Zweig bearbeite.
Meine typische Lösung besteht darin, zwei Kassen zu erstellen, aber es ist eine Schande, dass ich keine Zweige und Refs zwischen ihnen teilen kann. Ich möchte, dass nur zwei Arbeitsverzeichnisse von demselben .git-Ordner verwaltet werden.
Mir sind lokale Git-Klonlösungen bekannt (die Standardeinstellung ist das Festverknüpfen freigegebener Objekte und die Option --shared, mit der ein alternativer Objektspeicher mit dem ursprünglichen Repo eingerichtet wird), aber diese Lösungen reduzieren nur die Speicherplatznutzung und vor allem im Fall von --shared scheinen mit Gefahren behaftet.
Gibt es eine Möglichkeit, einen .git-Ordner zu verwenden und zwei Arbeitsverzeichnisse zu unterstützen? Oder ist Git fest codiert, damit immer nur ein Arbeitsverzeichnis ausgecheckt wird?
git-new-workdir
wird durchgit checkout --to=<path>
in Git 2.5 ersetzt. Siehe meine Antwort untengit worktree add <path> [<branch>]
(Git 2.5 rc2). Siehe meine bearbeitete Antwort untenAntworten:
Git 2.5 schlägt seit Juli 2015 einen Ersatz für
contrib/workdir/git-new-workdir
: git worktree vorSiehe Commit 68a2e6a von Junio C Hamano (
gitster
) .In der Pressemitteilung wird Folgendes erwähnt :
Siehe Commit 799767cc9 (Git 2.5rc2)
Das heißt, Sie können jetzt eine
git worktree add <path> [<branch>]
Warnung: Es gibt noch einen Abschnitt
git worktree
"BUGS" , den Sie beachten müssen.Hinweis: mit git 2.7rc1 (Nov 2015) Sie sind in der Lage Liste Ihre worktrees.
Sehen Sie verpflichten bb9c03b , begehen 92718b7 , begehen 5.193.490 , begehen 1ceb7f9 , begehen 1ceb7f9 , begehen 5.193.490 , begehen 1ceb7f9 , begehen 1ceb7f9 (8. Oktober 2015), begehen 92718b7 , begehen 5.193.490 , begehen 1ceb7f9 , begehen 1ceb7f9 (8. Oktober 2015), verpflichten 5.193.490 , Commit 1ceb7f9 (08. Oktober 2015), Commit 1ceb7f9 (08. Oktober 2015) festschreiben und ac6c561 festschreiben(02. Oktober 2015) von Michael Rappazzo (
rappazzo
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit a46dcfb , 26. Oktober 2015)Zum Beispiel:
Hinweis: Wenn Sie einen Arbeitsbaumordner verschieben, müssen Sie den manuell aktualisieren
gitdir
Datei .Siehe Commit 618244e (22. Januar 2016) und Commit d4cddd6 (18. Januar 2016) von Nguyễn Thái Ngọc Duy (
pclouds
) .Mit freundlicher Unterstützung von Eric Sunshine (
sunshineco
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit d0a1cbc , 10. Februar 2016)Das neue Dokument in Git 2.8 (März 2016) enthält:
Seien Sie vorsichtig beim Löschen eines Zweigs: Vor Git 2.9 (Juni 2016) können Sie einen in einem anderen Arbeitsbaum verwendeten löschen .
Siehe Commit f292244 (29. März 2016) von Kazuki Yamaguchi (
rhenium
) .Geholfen von: Eric Sunshine (
sunshineco
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 4fca4e3 , 13. April 2016)In ähnlicher Weise wurde vor Git 2.9 (Juni 2016) beim Umbenennen eines in einem anderen Arbeitsbaum ausgecheckten Zweigs der symbolische KOPF in diesem anderen Arbeitsbaum nicht angepasst.
Siehe Commit 18eb3a9 (08. April 2016) und Commit 70999e9 , Commit 2233066 (27. März 2016) von Kazuki Yamaguchi (
rhenium
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 741a694 , 18. April 2016)Der Verriegelungsmechanismus wird offiziell mit Git 2.10 (Q3 2016) unterstützt.
Siehe Commit 080739b , Commit 6d30862 , Commit 58142c0 , Commit 346ef53 , Commit 346ef53 , Commit 58142c0 , Commit 346ef53 , Commit 346ef53 (13. Juni 2016) und Commit 984ad9e , Commit 6835314 (03. Juni 2016) von Nguyễn Thái Ngọc Duy (
pclouds
) .Vorgeschlagen von: Eric Sunshine (
sunshineco
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 2c608e0 , 28. Juli 2016)Git 2.13 (Q2 2017) fügt eine
lock
Option in Commit 507e6e9 (12. April 2017) von Nguyễn Thái Ngọc Duy (pclouds
) hinzu .Vorgeschlagen von: David Taylor (
dt
) .Mit freundlicher Unterstützung von Jeff King (
peff
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit e311597 , 26. April 2017)So
git worktree add' --lock
ist das Äquivalent vongit worktree lock
nachgit worktree add
, aber ohne Rennbedingung.Git 2.17+ (Q2 2018) fügt hinzu
git worktree move
/git worktree remove
: siehe diese Antwort .Git 2.19 (Q3 2018) füge ein "
--quiet
" Option hinzu "git worktree add
" weniger ausführlich .Siehe Commit 371979c (15. August 2018) von Elia Pinto (
devzero2000
) .Unterstützt von: Martin Ågren, Duy Nguyen (
pclouds
) und Eric Sunshine (sunshineco
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit a988ce9 , 27. August 2018)Beachten Sie, dass "
git worktree add
" verwendet wurde, um "einen verfügbaren Namen mit stat und dann zu findenmkdir
", was rassenanfällig ist.Dies wurde mit Git 2.22 (Q2 2019) durch Verwendung
mkdir
und Reaktion auf behobenEEXIST
in einer Schleife .Siehe Commit 7af01f2 (20. Februar 2019) von Michal Suchanek (
hramrach
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 20fe798 , 09. April 2019)Git 2.22 (Q2 2019) korrigiert die Logik, um festzustellen, ob ein Git-Repository über einen funktionierenden Baum verfügt. "
git branch -D
" vor dem Entfernen des Zweigs , der derzeit versehentlich ausgecheckt wurde.Die Implementierung dieser Logik wurde für Repositorys mit ungewöhnlichem Namen unterbrochen, was heutzutage leider die Norm für Submodule ist.
Siehe Commit f3534c9 (19. April 2019) von Jonathan Tan (
jhowtan
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit ec2642a , 08. Mai 2019)quelle
Die
git
Distribution wird mit einem bereitgestellten Skript namens geliefertgit-new-workdir
. Sie würden es wie folgt verwenden:Dabei ist Projektverzeichnis der Name des Verzeichnisses, das Ihr
.git
Repository enthält. Dieses Skript erstellt ein anderes.git
Verzeichnis mit vielen Symlinks zum ursprünglichen Verzeichnis, mit Ausnahme von Dateien, die nicht freigegeben werden können (wie der aktuelle Zweig), sodass Sie in zwei verschiedenen Zweigen arbeiten können.Es klingt ein bisschen zerbrechlich, ist aber eine Option.
quelle
git-new-workdir-recursive
welche ein Wrapper istgit-new-workdir
.Ich bin auf diese Frage gestoßen und habe auf eine Lösung gehofft, die ich hier nicht gefunden habe. Nachdem ich nun gefunden hatte , was ich brauchte, beschloss ich, es hier für andere zu posten.
Vorsichtsmaßnahme: Dies ist wahrscheinlich keine gute Lösung, wenn Sie mehrere Zweige gleichzeitig bearbeiten müssen , z. B. OP-Zustände. Sie möchten nicht mehrere Zweige gleichzeitig auschecken, die Sie nicht bearbeiten möchten. (Mehrere Arbeitsverzeichnisse, die von einem .git-Ordner unterstützt werden.)
Seit ich zum ersten Mal auf diese Frage gekommen bin, habe ich einige Dinge gelernt:
Was für ein " nacktes Repository " ist. Es ist im Wesentlichen der Inhalt des
.git
Verzeichnisses, ohne sich in einem Arbeitsbaum zu befinden.Die Tatsache, dass Sie den Speicherort des verwendeten Repos (den Speicherort Ihres
.git
Verzeichnisses) in der Befehlszeile mit dergit
Option angeben können--git-dir=
Die Tatsache, dass Sie den Speicherort Ihrer Arbeitskopie mit angeben können
--work-tree=
Was für ein "Spiegel-Repo" ist.
Letzteres ist eine ziemlich wichtige Unterscheidung. Ich eigentlich nicht will Arbeit auf dem Repo, ich brauche nur Kopien verschiedenen Zweige haben und / oder Tags gleichzeitig ausgecheckt. Tatsächlich muss ich sicherstellen, dass sich die Zweige nicht von den Zweigen meiner Fernbedienung unterscheiden. Ein Spiegel ist also perfekt für mich.
Für meinen Anwendungsfall bekam ich also das, was ich brauchte:
Die große Einschränkung dabei ist, dass es für die beiden Kopien keinen separaten KOPF gibt. Nach dem oben
git --git-dir=<localgitdir> --work-tree=firstcopy status
Gesagten werden beim Ausführen alle Unterschiede von Zweig2 zu Zweig1 als nicht festgeschriebene Änderungen angezeigt, da HEAD auf Zweig2 zeigt. (Deshalb verwende ich die-f
Option, um zu verwendencheckout
, da ich eigentlich nicht vorhabe, lokal Änderungen vorzunehmen. Ich kann jedes Tag oder jeden Zweig für jeden Arbeitsbaum auschecken, solange ich die-f
Option verwende.)Für meinen Anwendungsfall, dass mehrere Kassen gleichzeitig auf demselben Computer vorhanden sind, ohne dass sie bearbeitet werden müssen , funktioniert dies einwandfrei. Ich weiß nicht, ob es eine Möglichkeit gibt, mehrere HEADs für die mehreren Arbeitsbäume ohne ein Skript zu haben, wie es in den anderen Antworten behandelt wird, aber ich hoffe, dass dies trotzdem für jemand anderen hilfreich ist.
quelle
$HOME
. Es gibt noch eine weitere Einschränkung bezüglich der oben beschriebenen Methode, die ich später entdeckt habe und die mit Dateien zu tun hat, die in dem einen oder anderen Zweig nicht vorhanden sind. Wenn Sie A in dir1 auschecken, dann B in dir2 auschecken und dann C in dir1 auschecken. Wenn eine Datei in A, aber nicht in B oder C vorhanden ist, wird die Datei auch durch das Auschecken nicht aus dir1 entfernt .git clean
In einem solchen Fall müssen Sie möglicherweise experimentieren - oder das tun, was ich getan habe - und diese Methode einfach nur zum Auffüllen eines frisch erstellten Verzeichnisses verwenden.Die einzige Lösung, die ich mir vorstellen kann, besteht darin, zwei Verzeichnisse zu klonen und sie als Remote-Repositorys voneinander hinzuzufügen. Sie können dann weiterhin Inhalte aus dem geänderten in das andere ziehen, ohne tatsächlich etwas in das Remote-Repository zu verschieben.
Ich gehe davon aus, dass Sie zwei Arbeitsverzeichnisse und nicht zwei Klone der Fernbedienung haben möchten, weil Sie einige Zweige nicht auf die Fernbedienung übertragen möchten. Andernfalls würden zwei Klone Ihrer Fernbedienung einwandfrei funktionieren - Sie müssen nur einige Pushs und Pulls ausführen, um alle drei synchron zu halten.
quelle