Git Anfängerfrage:
Ich habe ein kleines privates Webprojekt, das lokal mit msysgit versioniert ist. Es gibt kein externes Repository, da es nur für mich ist, sodass ich grundsätzlich tun kann, was ich will.
Ich habe dies im Projektverzeichnis eingerichtet, dh in "webroot".
Nun musste ein zweites Verzeichnis erstellt werden, das parallel zur Webroot platziert wurde. Nennen wir es Vermögenswerte.
Die Struktur ist nun also wie folgt:
\ project directory
----\webroot
----\assets
Ich würde dieses neue Verzeichnis gerne in das Git-Repository aufnehmen, damit ich auch Versionsänderungen an dort gespeicherten Dateien vornehmen kann, aber natürlich kann ich "git add ../assets" nicht verwenden. Ich bin auch nicht geneigt, ein neues Git-Projekt in project_directory zu erstellen, da dies alle meine vorherigen Commits verlieren würde.
Wie verschiebe ich das Repository von "webroot" nach oben in "project_directory", behalte meine Commits bei und kann dann "Assets" einschließen?
quelle
Antworten:
Sie möchten also, dass Ihr Git-Repo so aussieht:
Dazu müssen Sie die vorhandenen Dateien in Ihrem Repo in ein neues
webroot
Unterverzeichnis verschieben.Dann möchten Sie auf Ihrem lokalen Dateisystem Ihren Klon in ein Verzeichnis verschieben, in dem er sich jetzt befindet:
Dann möchten Sie das
assets
Verzeichnis (und die Dateien) zum Git-Repo hinzufügen :quelle
mv webroot/.* .
, um die Repo- und .gitignore-Dateien zu verschieben.git mv * webroot
funktioniert nicht, da der Bash-Platzhalter * auch durch Webroot ersetzt wird, wodurch der Befehl ausgeführt wirdgit mv webroot webroot
. Git wird daran scheitern. Der andere Ordner, mit dem es Probleme gab, war .git. Daher musste ich eine spezielle bash env-Variable verwenden,GLOBIGNORE=webroot:.git
damit * nicht durch diese beiden Verzeichnisse ersetzt wird. Dank dessen musste ich nicht Dutzende von manuellen Git MV erstellen - mein Verzeichnis enthält viele Ordner und Dateien. Ich musste den .git-Ordner nur manuell verschieben.Sie können Ihr .git-Verzeichnis auch einfach um eine Ebene nach oben verschieben und Ihren Arbeitsbaum aktualisieren.
Nicht positiv, aber ich bin mir ziemlich sicher, dass der Weg zu core.worktree absolut sein muss.
quelle
mv .git / ../
Ich nehme an, Sie wollten den Verlauf so umschreiben, dass er alle Dateien in allen Revisionen enthält, als wären sie immer in einem Unterverzeichnis webroot / statt im Stammverzeichnis gewesen
Die git Filter-Branch-Manpage hat die Antwort, hier eine verbesserte Version, die alle vorhandenen Refs (Zweige) und Tags neu schreibt:
Es wurde darauf geachtet, dass dies nur ein Index ist, damit der Prozess auch bei großen Repos schnell abläuft. Denken Sie daran, (wenn Sie zufrieden sind) die ursprünglichen Refs (.git / refs / original / *) zu entfernen und das Repo neu zu verpacken, um die veralteten Baumobjekte zu verlieren.
quelle
Ihre Commits sind nicht lokal an den "Webroot" -Ordner gebunden, den sie im Git-Repo gespeichert haben.
Sie können einfach das Webroot-Verzeichnis entfernen, indem Sie das Repository am neuen Speicherort "/ project directory" erneut überprüfen. Fügen Sie das Assets-Verzeichnis hinzu und schreiben Sie es fest.
quelle
Der folgende Befehl würde Ihren Git-Verlauf neu schreiben. Es würde so aussehen, als ob der Inhalt die
webroot
ganze Zeit drin wäre. Normalerweise ist das Umschreiben des Verlaufs problematisch, wenn mehrere Personen mit einem Repo arbeiten. Da Sie alleine daran arbeiten, sollte es in Ordnung sein.quelle