Ich habe ein Git-Repository, dessen Struktur wie folgt aussieht:
+--repo.git
|
+----+bootstrap.py
+----+buildout.cfg
+----+.gitignore
+----+webapp
|
+---------+manage.py
+---------+modules
+---------+templates
+---------+static
+---------+...
+---------+...
Ich möchte den Inhalt des webapp
Ordners um eine Ebene nach oben verschieben. Mein resultierendes Repo sollte folgendermaßen aussehen:
+--repo.git
|
+----+bootstrap.py
+----+buildout.cfg
+----+.gitignore
+----+manage.py
+----+modules
+----+templates
+----+static
+----+...
+----+...
Kann ich dies tun, indem ich einfach alle Dateien des webapp
Verzeichnisses um eine Ebene nach oben verschiebe, das leere webapp
Verzeichnis lösche und dann die Änderungen festschreibe? Würde dies den Festschreibungsverlauf der Dateien im webapp
Verzeichnis beibehalten ?
Obwohl dies für viele von Ihnen eine sehr einfache Frage ist, möchte ich sicher sein. Das Letzte, was ich möchte, ist eine Git-Suppe.
Ich habe versucht, die Dateien zu verschieben, aber ich habe den Commit-Verlauf verloren, da git eine Verschiebung oder Umbenennung nicht wirklich handhabt. Ich weiß, dass es, obwohl es als neue Datei in den Protokollen angezeigt wird, immer noch möglich ist, den Festschreibungsverlauf für die Datei mithilfe einiger Optionen in anzuzeigen git log
.
Nach dem, was ich gelesen habe, wäre der beste Weg, dies zu erreichen, die Verwendung git-filter
. Ich bin nicht sehr gut mit Shell oder Git, also könnte mir jemand sagen, was ich ausführen müsste, um das oben Genannte zu tun.
git mv
verschoben wurden. Sie können dies überprüfen, nachdem Sie die neuen Dateien mitgit add
using hinzugefügt habengit status
.Antworten:
Der richtige Weg, dies zu tun, ist:
git mv repo.git/webapp/* repo.git/. git rm repo.git/webapp git add * git commit -m "Folders moved out of webapp directory :-)"
quelle
git mv /path/new/old/* /path/new/.
wopath/new/old
sich die Dateien befinden und/path/new
wo sie sich befinden sollen. Das*
repräsentiert die Dateien selbst und nicht das Verzeichnis.fatal: bad source, source=webapp/*, destination=*
Das funktioniert überhaupt nicht; (Eine andere Variante von Sumeets Antwort: Führen Sie im Repository-Verzeichnis über "webapp" den folgenden Befehl aus:
-k - enthält Dateien, die noch nicht der Versionskontrolle unterliegen, andernfalls erhalten Sie:
quelle
In Windows können Sie Folgendes tun:
Während Sie sich im untergeordneten Ordner befinden
Das Ergebnis, dass sich alle Objekte im untergeordneten Ordner im übergeordneten Ordner befinden
Bitte beachten Sie: Einige Fehler können auftreten, wenn Sie ein Objekt im untergeordneten Ordner haben, dessen Name dem untergeordneten Ordner entspricht
quelle
Ich konnte es einfach aus dem Zielordner zum Laufen bringen:
Es scheint dies nicht in der Windows - Shell funktioniert (nicht mit einem Fehler
Bad source
), aber es wird in Windows arbeiten , wenn Sie die Git Bash - Shell verwenden, die die erweitert*
Wildcard.quelle
Die von Ihnen erwähnte Lösung sollte funktionieren, da Git Änderungen zuerst basierend auf dem Hash der Dateien und dann ihrem Speicherort verfolgt.
Dies funktioniert nicht, wenn Sie beim Verschieben der Datei den Inhalt der Dateien ändern.
Probieren Sie es aus, und wenn es nicht funktioniert, können Sie die Änderungen rückgängig machen, bevor Sie die Änderungen in das Master-Repo übertragen :). Dies ist einer der Gründe, warum ich Git wirklich mag.
Bearbeiten
Ich habe vergessen zu erwähnen, dass Sie den Parameter '--follow' verwenden müssen, um die Änderungen nach einer Umbenennung zu sehen. Überprüfen Sie dieses Beispiel
Zuerst habe ich ein neues Git Repo erstellt
Dann erstellte eine Datei in Ordner / Test
Dann wurde die Datei in den neuen Ordner / Test verschoben
Und
git log --follow newfolder/test
zeigt den vollständigen Verlauf an (ich habe den Parameter -p hinzugefügt, um weitere Informationen anzuzeigen, z. B. den Pfad).Ich hoffe das hilft!
quelle
Wenn Sie PowerShell verwenden, können Sie diesen Befehl von Ihrem Projektstamm aus ausführen und den Inhalt der Webanwendung dort platzieren.
Get-ChildItem .\webapp\ | ForEach-Object { git mv $_.FullName .\ }
quelle
Ja, Sie können die Dateien einfach verschieben. Sie müssen git jedoch mitteilen, dass die alten Dateien im Webapp-Ordner verschwunden sind, dh, git muss den Index der fertigen / festgeschriebenen Dateien aktualisieren.
Sie können also verwenden
git add -A .
, um git auf alle Änderungen aufmerksam zu machen, oder verwendengit mv <files>
, um git anzuweisen, die Verschiebung selbst durchzuführen. Siehe die git mv manpage .--aktualisieren.
Sie haben bemerkt, dass Sie dachten ".. git handhabt einen Zug oder eine Umbenennung nicht wirklich .." - Ich war zuerst auch verwirrt und hatte die Funktionsweise des Index nicht vollständig verstanden. Einerseits sagen die Leute, dass git nur Schnappschüsse macht und keine Umbenennungen verfolgt, aber dann werden Sie beim Aktualisieren
.gitignore
oder beimv
einer Datei usw. als "fehlgeschlagen" eingestuft. Dieser "Fehler" ist eine Verwirrung über die Funktionsweise des Index.Meine Visualisierung ist, dass der Index- / Staging-Bereich ein Ort wie eine Storyboard-Wand ist, an dem Sie eine Kopie Ihrer neuesten und besten "fertigen" Datei einschließlich ihres Pfads (unter Verwendung
git add
) platzieren, und es ist diese Kopie, die festgeschrieben wird. Wenn Sie diese Kopie nicht von der Storyboard-Wand (dhgit rm
) entfernen, wird sie von git weiterhin festgeschrieben, und es herrscht große Verwirrung (siehe viele SO-Fragen ...). Der Index wirdmerge
in ähnlicher Weise auch von git während s verwendetquelle
Unter Windows mit Bash hat Folgendes funktioniert:
quelle
Ja, git verfolgt die Änderungen in früheren Inhalten. Es werden Hashes des Dateiinhalts verwendet, sodass es sich unabhängig davon, wo sie sich in der Verzeichnisstruktur befinden, um dieselbe Datei handelt.
Daher sollten Sie die Verschiebung in einem Commit durchführen und dann alle Änderungen in einem nachfolgenden Commit korrigieren. Dadurch kann Git die Umleitung mit maximaler Effizienz bestimmen und hat keinen Einfluss auf die im Repository gespeicherte Datenmenge (da Sie diese Änderungen sowieso vornehmen würden).
quelle