2012-05-19 6 views
9

Ich arbeite gerade an meiner eigenen Neuroimaging Toolbox, die unter MATLAB/SPM8 läuft und die meisten Programmdateien in meinem Repository sind MATLAB *.m Dateien. Ich habe verschiedene Funktionszweige und einen Zweig, den ich für laufende Analysen mit der aktuellen Version verwende. Gleichzeitig entwickle ich den Code in master und verfüge über Verzweigungen, die dann ständig zu master verzweigen.Wie arbeiten Sie gleichzeitig mit git an verschiedenen Versionen von Dateien?

Jetzt ist das Problem, dass viel Zeit die Analysen ich in analysis Zweig renne nehmen (sogar Tage), und während dieser Zeit bin ich zu git checkout master oder git checkout new-feature nicht in der Lage. Dies schränkt meine Produktivität stark ein.

So, wie es nicht möglich ist, mehrere Zweige gleichzeitig geöffnet zu halten, Ich denke, den Zweig aus dem Entwicklungs-Repository in ein eigenes Repository zu verschieben. Die Frage ist, dass, wenn ich git init ein neues Repository auf dem aktuellen Zweig basiert, gibt es einen Weg, um irgendwie git merge immer wieder von aktuellen master Zweig (des Entwicklungs-Repository) in der Lage, neu entwickelten Code meiner Entwicklung zu verwenden Repository im neuen Analyse-Repository?

+3

Eigentlich Sie * kann * mehrere Zweige offen halten zugleich gleichzeitig: [git auf zwei Zweige gleichzeitig arbeiten] (http://stackoverflow.com/questions/2048470/git-working -on-two-branches-simultan) – sleske

Antwort

8

Wenn Sie git clone Ihre vorhandenen Repository in ein neues Repository, können Sie dann git push oder git fetch von einem zum anderen die Refs (Filialen), um bis Sie haben sich verändert; keine Zusammenführungen sind beteiligt. Der Inhalt des Repositorys wird automatisch fest verknüpft, um Speicherplatz zu sparen.

Wenn Sie die --mirror Option git clone und git push verwenden, wird auslassen Sie Remote-Tracking-Verzweigungen und haben nur die gleichen Zweige in beiden, die einfacher und symmetrisch ist, aber weniger einer herkömmlichen Verwendung von git. Für maximale "folge den Tutorials" Einfachheit, ordnen Sie stattdessen ein drittes "zentrales" Repository an (das erstellt werden sollte --bare), die beide Ihrer Arbeitsrepositorys Klone sind.

Es sollten keine Zusammenführungen (außer "Fast-Forward-Merges", die nicht wirklich zusammengeführt werden, sondern ein alter Zweigkopf durch einen neueren Abkömmling ersetzt wird) erforderlich sein, da Sie an den gleichen Zweigen arbeiten; Sie haben nur zwei Kopien von ihnen. Wenn Ihre Analyse abgeschlossen ist und Sie in der Lage sind, den Analysezweig zu aktualisieren, geben Sie einfach git merge --ff-only master in analysis ein; Sie können dies in jedem beliebigen Repository tun, aber vergessen Sie nicht, die Änderungen mit einem git push other-repository zu synchronisieren.


Eine weitere Option (seit Git Version 2.5) ist der git worktree Befehl, der etc. unabhängig mehrere unabhängige Arbeits Bäume, in dem Sie können git checkout erlaubt. Der Unterschied zwischen dieser und der obigen Option, einen Klon zu erstellen, besteht darin, dass hier nur ein Satz von Zweigen existiert.

Allerdings gilt dies (ab Version 2.8) immer noch als eine "experimentelle" Funktion, und ich habe es nicht persönlich verwendet, um seine Zuverlässigkeit und Nützlichkeit zu kommentieren.

+0

Das scheint eine gute Idee zu sein. Wenn ich mein Repository (ohne '--mirror' 'klicke', weil ich Dropbox als privates Remote-Tracking-Repository nutze, wie [hier erklärt] (http://michael.otacoo.com/linux-2/ setting-a-git-server-with-dropbox /)), kann ich noch neue Zweige erstellen und synchronisieren? Wenn ich einen neuen Feature-Zweig erstelle, sollte ich ihn mit demselben Namen sowohl in meinem "Original" -Repository als auch im neuen "Analyse" -Repository erstellen? Oder ist es genug, um es nur in 'original' Repository zu erstellen, wenn ich immer nur 'Master' Zweig des 'Original' Repository zu neuen 'Analyse' Repository zusammenführen? – nrz

+1

Wenn das einzige, was Sie jemals tun, um den Zweig "Analyse" von "Master" zu "Analyse" zu verschmelzen, dann ja, dieser Zweig muss nicht irgendwo anders als das Analyse-Repository leben. Tatsächlich muss es kein getrennter Zweig sein: Es ist nur der einzige Zweig in diesem Repository, mit 'Ursprung/Master' als Upstream. Jede Zusammenführung, die Sie damit machen, sollte schnell vorwärts gehen. –

+0

Danke, das hilft mir sehr. – nrz

2

Als Alternative zum Klonen des Repos, wie von Kevin Reid erklärt, könnten Sie auch git-new-workdir verwenden, um eine zweite Arbeitskopie für Ihr Repo zu erstellen. Auf diese Weise sehen beide Arbeitskopien automatisch immer die gleichen Zweige, da sie sich ein Git Repo teilen.

Der Vorteil gegenüber dem Klonen des Repos besteht darin, dass keine manuelle Synchronisierung/Zusammenführung erforderlich ist. In dem Moment, in dem Sie in Arbeitsverzeichnis A festschreiben, wird das Festschreiben in Arbeitsverzeichnis B (z. B. git log) sichtbar sein.

Nur Vorbehalt: Wenn Sie das Repository ändern (commiting, rebasing, einen Zweig zurücksetzen etc.), sollte nicht der gleiche Zweig im anderen workdir ausgecheckt werden - sonst wird git etwas verwirrt (siehe git-new-workdir: Commit in working tree A causes bogus changes in tree B).

See: git working on two branches simultaneously