12 Stimmen

git und C++-Workflow, wie werden Objekt- und Archivdateien behandelt?

Ich verwende git als Schnittstelle zu einem SVN-Repository. Ich habe mehrere Git-Zweige für die verschiedenen Projekte, an denen ich arbeite.

Wenn ich jetzt mit "git checkout" von einem Zweig zu einem anderen wechsle, sind alle kompilierten ausführbaren Dateien und Objektdateien aus dem vorherigen Zweig noch vorhanden. Ich möchte, dass beim Wechsel von Zweig A nach B ein Baum mit allen Objektdateien und Binärdateien vom letzten Mal, als ich an Zweig B gearbeitet habe, entsteht.

Gibt es eine Möglichkeit, dies zu behandeln, ohne mehrere Git-Repositories zu erstellen?

Aktualisierung: Ich verstehe, dass ausführbare Dateien und Binärdateien nicht im Repository landen sollten. Ich bin etwas enttäuscht darüber, dass all die Verzweigungsfunktionen in Git für mich nutzlos sind, da sich herausstellt, dass ich für jede Verzweigung, die ich starten möchte, mein Proxy-Git-Repository klonen muss. Etwas, das ich bereits für SVN getan habe und hoffte, mit Git zu vermeiden. Natürlich muss ich das nicht tun, aber es würde dazu führen, dass ich die meiste Zeit nach dem Wechsel zwischen den Zweigen ein neues Make machen müsste (was nicht lustig ist).

9voto

Ryan Graham Punkte 7768

Was Sie wollen, ist ein vollständiger Kontext, nicht nur der Zweig... der ist allgemein für ein Versionskontrollwerkzeug nicht in Frage kommt. Der beste Weg, dies zu tun, ist die Verwendung mehrerer Repositories.

Machen Sie sich aber keine Sorgen über die Ineffizienz dieser Maßnahme... Machen Sie Ihr zweites Repository zu einem Klon des ersten. Git verwendet automatisch Links, um mehrere Kopien auf der Festplatte zu vermeiden.

Hier ist ein Hack, der Ihnen das gibt, was Sie wollen

Da Sie getrennte obj-Verzeichnisse haben, könnten Sie Ihre Makefiles so ändern, dass der Basis-Speicherort dynamisch ist, z. B. so:

OBJBASE = `git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1\//'`
OBJDIR = "$(OBJBASE).obj"
# branch master: OBJBASE == "master/", OBJDIR == "master/.obj"
# non-git checkout: OBJBASE == "", OBJDIR == ".obj"

Dadurch wird Ihr Zweigname in OBJBASE umgewandelt, von dem aus Sie Ihr tatsächliches objdir-Verzeichnis erstellen können. Ich überlasse es Ihnen, es an Ihre Umgebung anzupassen und es für Nicht-Git-Benutzer Ihrer Makefiles freundlich zu gestalten.

6voto

Dies ist nicht git- oder svn-spezifisch - Sie sollten Ihren Compiler und andere Werkzeuge die Ausgabe von Zwischendateien wie .o-Dateien in Verzeichnisse leiten lassen, die nicht unter Versionskontrolle stehen.

5voto

Tobu Punkte 23823

Um mehrere Checkouts desselben Repo zu erhalten, können Sie git --work-tree verwenden. Zum Beispiel,

mkdir $BRANCH.d
GIT_INDEX_FILE=$BRANCH.index git --work-tree $BRANCH.d checkout $BRANCH

3voto

VonC Punkte 1117238

Sie könnten Ihren IDE-Compiler so einstellen, dass er alle privaten temporären Dateien (.class usw.) in <output>\branchName\... .

Indem Sie Ihre Kompilierungseinstellungen verzweigungsweise konfigurieren, können Sie den Namen der Verzweigung in den Pfad des Ausgabeverzeichnisses eintragen.

Auf diese Weise können Sie, auch wenn Ihre privaten Dateien erhalten bleiben, wenn Sie git checkout ist Ihr Projekt auf dem neuen Zweig einsatzbereit.

3voto

adl Punkte 14904

In der contrib/ Verzeichnis des git Distribution gibt es ein Skript namens git-new-workdir die es Ihnen ermöglicht, mehrere Zweige in verschiedenen Verzeichnissen auszuchecken, ohne Ihr Repository zu klonen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X