2010-11-22 4 views
5

Ich habe gerne git auf meinem Rechner für ein Projekt "MyProject". MyProject ist eigentlich Teil einer größeren gemeinsamen Forschungsanstrengung "WholeThing". Es gibt praktisch keine Überschneidung zwischen myProject und OtherProjects in der WholeThing.Migrieren von lokalen Git-Repository in größere Remote-Repository beim Neuschreiben von Pfaden

Jetzt haben Big Bosse beschlossen, die gesamte Entwicklung auf ein zentrales Git-Repository zu legen (für Dokumentation und Backup). Für mich ergibt das bisher Sinn.

Angenommen, ich habe keinen privilegierten Zugriff auf das zentrale Repository.

Das Problem ist, dass MyProject Karten in ein Unterverzeichnis des WholeThing, dh

local repo: 
MyProject -| 
      |- .git 
      | 
      |- dirs 


remote repo: 
WholeThing -| 
      |- .git 
      | 
      |- Area1 
      | 
      |- Area2 
       |------ MyProject 
       |------ DudesProject 

Wie kann ich meine lokalen Repository in das richtige Unterverzeichnis auf dem zentralen Repository erhalten, während der Geschichte zu erhalten und Zweig ?

Ich (denke ich;) verstehe entfernte Zweige und so, aber ich habe noch keinen Weg gefunden, den Pfad der MyProject-Datei mit "WholeThing/Area2" zu versehen, kurz bevor ich die Dateien in mein lokales Repository verschiebe und ein begehen, bevor Sie drücken. Es muss sicherlich einen anderen Weg geben?

Ich habe auch nichts dagegen, das WholeThing zu klonen und runter zu MyProject zu navigieren, sobald die Migration abgeschlossen ist ... also suche ich nicht nach Submodulen oder so (und ich habe keinen administrativen Zugriff auf das zentrale Repository) .

Alle Ideen sind willkommen!

Cheers, Jose

Antwort

3

Danke für die Antworten bisher ... hat mich dazu gebracht, die Frage auf Google anders zu formulieren.

Die Antwort ist eigentlich in der man-Seite geschrieben, Sie müssen nur bis zum Ende lesen.

Die Lösung besteht darin, den Verlauf mit git filter-branch neu zu schreiben und dabei den Pfad jeder Datei neu zu schreiben. Das Umschreiben des Pfades kann im Prinzip mit --tree-filter (glaube ich) oder mit --index-filter gemacht werden, was viel schneller ist.

Das Code-Snippet unten ist fast wörtlich genommen von der Manpage git help filter-branch, gerade bearbeitet, um die Verzeichnisse in meinem Beispiel widerzuspiegeln. Es fragt nach jedem Commit für die Pfadnamen der beteiligten Datei, schreibt sie mit dem Präfix "WholeThing/Area2/MyProject /" neu und gibt die Commits erneut aus.

Der nächste (hoffentlich einfache) Schritt besteht darin, das Remote-Repository hinzuzufügen und zu verschieben

Prost & danke!

0

Im Idealfall sollten Sie Ihr eigenes Unter Projekt MyProject.git unter Wholething/Area2.

Wenn Ihre Chefs nur ein Git-Repository für jedes Projekt haben wollen, macht das keinen Sinn, aber wenn sie es trotzdem wollen, würde das bedeuten, dass der WholeThing-Baum ein ganz anderer Baum ist als Sie und Sie kann nichts anderes tun, als das Ganze zu ziehen, dein Verzeichnis hinzuzufügen und alles (wie auch das DudesProject) zu pushen (du kannst NICHT an einer Untermenge oder einem Unterverzeichnis eines Git-Baums arbeiten). Wie auch immer, da das 2 verschiedene Bäume sind, wirst du all deine Geschichte und Zeug verlieren.

Der richtige Weg, Sachen zu tun ist, einen Git Tree pro Projekt zu haben und so, also kein .git unter WholeThing. Mit der richtigen Art erscheint "WholeThing/Area2" nur natürlich in der URL, wenn Sie den Remote-Zweig hinzufügen.

1

ja der nächste Schritt ist schön und einfach

git remote add other [path/to/repo] 
git fetch other 
git checkout -b other-master other/master 
git checkout master 
git merge other-master 

und Sie sollten gut gehen