GIT ändern Basis - /Root-Ordner
Ich habe eine lange (~2 Jahre) repo mit einer Menge von commits/Zweige, die nun für einige Gründe, die ich ändern muss im root-Ordner der repository ein Ordner über.
Einige Beispiele, um zu klären, das Konzept.
Habe ich mein repository in einem Ordner:
c:\workspace\test\src\
so, in meinem repo hat alle änderungen in den Dateien/Unterordner des oben ein.
Ich würde gerne verschieben Sie den repository:
c:\workspace\test
Lage von nun an um alle änderungen in den test-Ordner mantaining das alte repository-Historie..
also all die alten commits markiert sind, die im Ordner "\"
, sollte nun überprüft werden, in Ordner "\src"
für die alten commits, die ich kann oder kann nicht haben (es spielt wirklich keine Rolle) den eigentlichen Inhalt des Ordners..
ist das möglich?
Ich hoffe, dass das, was ich erklärt habe ist verständlich..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke du meinst, dass die top-level-Verzeichnis der repo ist
c:\workspace\test\
und Sie wollenc:\workspace\test\src\
werden die neuen top-level-Verzeichnis. Prüfen Sie zunächst, dass dies der Fall ist:Sollte es etwas ausdrucken, wie
c:\workspace\test\
wenn das wirklich Eure top-level-Verzeichnis.Wenn es ist, können Sie die
git filter-branch
Rebase-Befehl, um das 'src' Verzeichnis der neuen top-level. Seien Sie bitte vorsichtig, dass dies ist, was Sie wirklich wollen, zu tun, da es destruktiv ändern Ihre alten Geschichte! Jeder verpflichtet sich für diesen Zweig werden zurückgesetzt enthalten diesrc
Ordner wie die neue top-level. Sichern Sie Ihre aktuellen Zweig zuerst.Warnung!!! Beachten Sie, dass:
Für mehr Infos, Lesen Sie die "Machen Sie ein Unterverzeichnis der Neuen Wurzel" und "Die Tücken der Rebasierung" Abschnitte in das Git-Buch.
Wenn ich das richtig verstehe ist deine Frage, wenn du aus einem sauberen git repo (
git status
sagt "nichts zu committen, Arbeitsverzeichnis sauber"), die Sie ganz einfach bewegen Sie den.git
Verzeichnis vonc:\workspace\test\src\
zuc:\workspace\test\
.Dann haben Sie zu tun, eine 'große' commit mit allen Dateien in das neue layout. Git wird diese neue commit als eine große Bewegung. Keine neuen Inhalte, die notwendig ist, Dateien die gleiche wäre. Git wird nur die Registrierung der neuen Baum-layout (mit
src
) in seinem.git
dir.Re-Lektüre die Frage, die machen mich denken, möchten Sie vielleicht, um Ihre alten commits verfügbar in
src
UnterverzeichnisWenn dies der Fall ist, werden Sie brauchen, um vollständig zu umschreiben, Ihr Git-repository die Geschichte mit so etwas wie
git filter-branch --tree-filter '...'
` with the new
\src " .. aber ich weiß nicht, ob es möglich istKlingt wie Sie sollten nur müssen dies tun:
c:\workspace\test\src
zuc:\workspace\src
c:\workspace\test
, das ist vermutlich jetzt leerc:\workspace\src
zuc:\workspace\test
git
repositories in der Regel nicht halten eine Spur von Ihren übergeordneten Verzeichnissen so verschieben Sie das repository von einem Ort zum anderen sollten harmlos sein. Nun, was auch immer scripts/build-Dateien/was auch immer Sie in Ihrem repository enthalten hart codierte Pfade kann, ist eine ganz andere Geschichte...Sehen die docs in diejenigen Befehle, die Bedienung ist sehr einfach. Die Beratung in
filter-branch
's docs darum, es zu tun, seine Arbeit auf ein tmpfs ist wahrscheinlich lohnt sich, der mit zwei Jahren von Geschichte zu befassen.Möchten Sie vielleicht
grep -ri c.workspace.test .git
zu prüfen, absolute Pfadangaben in Ihren Konfigurationen und solche, zu überprüfen, Sie sind immer noch gültig.Erste, Klonen Sie das Repository, so dass Sie arbeiten können, auf die es in der isolation, und so, dass Ihre ursprüngliche intakt bleibt, falls hier etwas schief geht.
schreiben Sie ein Skript, das die entsprechenden änderungen an jedem einzelnen commit. Ich bin nicht vertraut mit Windows scripting, aber Sie wollen Ihr Skript und erstellen Sie ein neues Unterverzeichnis mit dem Namen
src
(d.h.,c:\sandbox\src
), dann bewegen Sie alles, außer den.git
Verzeichnis und alle.git*
Dateien (z.B..gitignore
) in das neue Unterverzeichnis. Sicherstellen, dass Ihr Skript funktioniert einwandfrei auf jedem commit in das repo, das nicht nur auf dem aktuellen Stand. Führen Sie dann:Dadurch wird git für die Kasse jedem commit in das repo, führen Sie Ihr Skript, und ersetzen Sie dann den commit mit dem Ergebnis. Weiter, wenn Sie irgendwelche ignoriert oder nachlässig Dateien, die Sie wollen, um Sie zu kopieren in die entsprechenden stellen in Ihrem neuen repo. Stellen Sie sicher, dass die filter-branch hatte die beabsichtigte Wirkung und das neue repo aussieht, wie Sie es wollten. Sobald Sie sicher sind, dass Sie zufrieden sind, löschen Sie
c:\workspace\test
und dann verschiebenc:\sandbox
zuc:\workspace\test
.Bevorzuge ich
--tree-filter
, wie hier dargestellt, eher als--index-filter
. Es ist weniger effizient (da hat es an der Kasse jeder Begehen, anstatt die Bearbeitung der index direkt), aber ich finde es viel intuitiver. Wenn nötig, wird es auch ermöglichen es Ihnen, änderungen am Inhalt von Dateien im repo (Aktualisierung absolute Pfade, vielleicht).