Ich habe eine Arbeitskopie des Projekts ohne Metadaten zur Quellcodeverwaltung. Jetzt möchte ich das Äquivalent von git-clone in diesen Ordner einfügen und meine lokalen Änderungen beibehalten.
Mit git-clone kann ich nicht in einen vorhandenen Ordner klonen. Was ist hier die beste Vorgehensweise?
Antworten:
Dies kann durch Klonen in ein neues Verzeichnis und anschließendes Verschieben des
.git
Verzeichnisses in Ihr vorhandenes Verzeichnis erfolgen.Wenn Ihr vorhandenes Verzeichnis "Code" heißt.
Dies kann auch ohne Auschecken während des Klonbefehls erfolgen. Weitere Informationen finden Sie hier .
quelle
git clone
den ersten Befehl verwenden, ist kein weiterer Checkout-Befehl erforderlich. Wenn Sie stattdessen so etwas wiegit clone --no-checkout
in diesem ersten Schritt verwenden, müssen Sie nach dem Verschieben des .git-Verzeichnisses gitgit reset HEAD
mitteilen, dass die Dateien nicht gelöscht wurden.git status
.Nicht klonen, sondern holen. Im Repo:
Anschließend können Sie den Baum zurücksetzen, um das gewünschte Commit zu erhalten:
und du bist wie du geklont hast.
Die interessante Frage hier (und die ohne Antwort): Wie Sie herausfinden können, auf welchem Commit Ihr nackter Baum basiert, auf welche Position Sie zurücksetzen müssen.
quelle
Folgendes habe ich getan, um den Hauptzweig in einem vorhandenen Verzeichnis auszuchecken:
quelle
-t
Flagge hier verwendet wird?Ich würde
git clone
in ein neues Verzeichnis wechseln und den Inhalt des vorhandenen Verzeichnisses in den neuen Klon kopieren.quelle
git clone wherever tmp && git mv tmp/.git . && rm -rf tmp
Mit anderen Worten, das Verschieben des.git
Verzeichnisses aus einem temporären Klon scheint einfacher zu sein, als den Arbeitsbaum des Klons zu bereinigen und die vorhandenen Dateien dort zu kopieren.git mv tmp/.git .
kehrtfatal: cannot move directory over file, source=tmp/.git, destination=.git
für mich zurück. Weiß jemand, worum es geht?mv
, nichtgit mv
; Dies erklärt jedoch nicht, warum Sie bereits eine.git
Datei dort haben (diegitdir: some/path/to/a/git-dir
eine „Git- Datei “ enthält; wenn sie nicht vorhanden wäre, hätten Sie siefatal: Not a git repository (or any of the parent directories): .git
stattdessen gesehen ).Die Verwendung eines temporären Verzeichnisses ist in Ordnung, funktioniert jedoch, wenn Sie diesen Schritt vermeiden möchten. Aus dem Stammverzeichnis Ihres Arbeitsverzeichnisses:
quelle
git reset --hard origin/master
entfernt alle lokalen Dateien.hard
undmixed
ist , dass gemischte lokale Änderungen halten wird (also wenn Sie später versuchen , es Ihnen zu ziehen würde zeigen , zB kann mit dem Fütterungsmaterial nicht ziehen. Sie unstaged Änderungen haben Bitte begehen oder bunkern sie ) , während schwer wird diese lokalen Änderungen verwerfenquelle
git reset --hard
die Verwendung werden die lokalen Dateiänderungen zerstört, insbesondere NICHT, was dieses OP angefordert hat.--mixed
sollte stattdessen verwendet werden.Gehen Sie wie folgt vor, um ein Git-Repo in ein leeres vorhandenes Verzeichnis zu klonen:
Beachten Sie das
.
am Ende Ihresgit clone
Befehls. Dadurch wird das Repo in das aktuelle Arbeitsverzeichnis heruntergeladen.quelle
fatal: destination path '.' already exists and is not an empty directory.
Viele Antworten, um es so zu machen, wie es das OP verlangt hat. Es ist jedoch erwähnenswert, dass es viel einfacher ist, das Gegenteil zu tun:
Sie haben jetzt den gewünschten Zielstatus - neuer Klon + lokale Änderungen.
quelle
Hierfür gibt es zwei Ansätze. Wenn möglich, würde ich mit einem sauberen Ordner für Ihr neues Git-Arbeitsverzeichnis beginnen und dann Ihre Version der Dinge später kopieren. Das könnte ungefähr so aussehen wie *:
Zu diesem Zeitpunkt sollten Sie eine ziemlich saubere Arbeitskopie mit Ihrem vorherigen Arbeitsordner als aktuellem Arbeitsverzeichnis haben, damit alle Änderungen, einschließlich Dateilöschungen, auf dem Radar angezeigt werden, wenn Sie ausgeführt werden
git status
.Auf der anderen Seite, wenn Sie es wirklich umgekehrt machen müssen, können Sie mit so etwas das gleiche Ergebnis erzielen:
In jedem Fall würde ich als Erstes so etwas wie
git stash
eine Kopie aller Ihrer lokalen Änderungen ausführen, die beiseite gelegt werden. Dann können Sie sie erneut anwenden und herausfinden, welche Sie festschreiben möchten.* In beiden Beispielen wird davon ausgegangen, dass Sie mit der Shell im übergeordneten Verzeichnis Ihres Projekts beginnen.
quelle
Dies ist die beste aller Methoden, die mir begegnet sind
Klonen Sie nur den .git-Ordner des Repositorys (mit Ausnahme der Dateien, in denen sie sich bereits befinden
existing-dir
) in ein leeres temporäres Verzeichnisgit clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
// möchte vielleicht --no-hardlinks zum Klonen von lokalem RepoVerschieben Sie den Ordner .git in das Verzeichnis mit den Dateien. Das macht
existing-dir
ein Git Repo.mv existing-dir/existing-dir.tmp/.git existing-dir/
Löschen Sie das temporäre Verzeichnis
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git glaubt, dass alle Dateien gelöscht wurden. Dadurch wird der Status des Repos auf HEAD zurückgesetzt.
WARNUNG: Alle lokalen Änderungen an den Dateien gehen verloren.
git reset --mixed HEAD
quelle
Wenn Sie mindestens git 1.7.7 verwenden (was
clone
die--config
Option gelehrt hat ), um das aktuelle Verzeichnis in eine Arbeitskopie umzuwandeln:Dies funktioniert durch:
.git
Ordner--mirror
macht den neuen Klon nach.git
Bedarf zu einem reinen Metadatenordner--config core.bare=false
widerspricht dem Implizitenbare=true
der--mirror
Option, wodurch das Repository über ein zugeordnetes Arbeitsverzeichnis verfügt und sich wie ein normaler Klon verhältDies funktioniert offensichtlich nicht, wenn
.git
in dem Verzeichnis, das Sie in eine Arbeitskopie umwandeln möchten, bereits ein Metadatenverzeichnis vorhanden ist.quelle
[core]
Abschnitt der lokalen Konfiguration sowohlbare = true
als auch enthältbare = false
. Problematischer ist, dass es die falschen Werte für dieorigin
Fernbedienung hat,[remote "origin"]
einschließlich des Abschnittsmirror = true
und einer Abrufspezifikation, die mit einer Arbeitskopie nicht richtig funktioniert. Nachdem diese Probleme behoben wurden, war das normale Klonen und Verschieben der neuen Arbeitskopien.git
effizienter.Normalerweise klone ich zuerst das anfängliche Repository und verschiebe dann alles im vorhandenen Ordner in das anfängliche Repository. Es funktioniert jedes Mal.
Der Vorteil dieser Methode ist, dass Sie nichts vom anfänglichen Repository verpassen, einschließlich README oder .gitignore.
Sie können auch den folgenden Befehl verwenden, um die Schritte abzuschließen:
quelle
Sie können dies tun, indem Sie die folgenden Befehlszeilen rekursiv eingeben:
quelle
Verwenden Sie einfach die. am Ende des
git clone
Befehls (in diesem Verzeichnis) wie folgt:quelle