710 Stimmen

Wie kann ich in ein nicht leeres Verzeichnis klonen?

Ich habe ein Verzeichnis A mit Dateien, die mit Verzeichnis B übereinstimmen. Verzeichnis A kann weitere benötigte Dateien enthalten. Verzeichnis B ist ein Git-Repositorium.

Ich möchte das Verzeichnis B in das Verzeichnis A klonen, aber Git-Clone erlaubt mir das nicht, da das Verzeichnis nicht leer ist.

Ich hatte gehofft, es würde nur .git klonen und da alle Dateien übereinstimmen, könnte ich von dort aus gehen?

Ich kann nicht in ein leeres Verzeichnis klonen, weil ich Dateien im Verzeichnis A habe, die nicht im Verzeichnis B sind, und ich möchte sie behalten.

Das Kopieren von .git ist keine Option, da ich Refs zum Pushen/Pullen benötige und diese nicht manuell einrichten möchte.

Gibt es eine Möglichkeit, dies zu tun?

Update: Ich glaube, das funktioniert, kann jemand Probleme erkennen? -->

cd a
git clone --no-hardlinks --no-checkout ../b a.tmp 
mv a.tmp/.git .
rm -rf a.tmp
git unstage # apparently git thinks all the files are deleted if you don't do this

1 Stimmen

Ich frage mich nur, was passieren würde, wenn '--no-checkout' weggelassen würde, außer dass der temporäre Klon mehr Speicherplatz und Zeit verbraucht. Wäre "git unstage" oder etwas anderes immer noch notwendig?

0 Stimmen

Vielleicht git-force-clone ?

862voto

cmcginty Punkte 106764

Das hat bei mir funktioniert:

git init
git remote add origin PATH/TO/REPO
git fetch
git reset origin/master  # Required when the versioned files existed in path before "git init" of this repo.
git checkout -t origin/master

NOTA: -t setzt den Upstream-Zweig für Sie, wenn Sie das wollen, was normalerweise der Fall ist.

185voto

Dale Forester Punkte 16955

In den folgenden Shell-Befehlen existing-dir ist ein Verzeichnis, dessen Inhalt mit den verfolgten Dateien in der repo-to-clone Git-Repository.

# Clone just the repository's .git folder (excluding files as they are already in
# `existing-dir`) into an empty temporary directory
git clone --no-checkout repo-to-clone existing-dir/existing-dir.tmp # might want --no-hardlinks for cloning local repo

# Move the .git folder to the directory with the files.
# This makes `existing-dir` a git repo.
mv existing-dir/existing-dir.tmp/.git existing-dir/

# Delete the temporary directory
rmdir existing-dir/existing-dir.tmp
cd existing-dir

# git thinks all files are deleted, this reverts the state of the repo to HEAD.
# WARNING: any local changes to the files will be lost.
git reset --hard HEAD

140voto

mohsaied Punkte 1926

Eine leichte Änderung einer der Antworten, die bei mir funktioniert hat:

git init
git remote add origin PATH/TO/REPO
git pull origin master

um sofort mit der Arbeit am Master-Zweig zu beginnen.

52voto

JohnFF Punkte 678

Warnung - dies könnte möglicherweise Dateien überschreiben.

git init     
git remote add origin PATH/TO/REPO     
git fetch     
git checkout -t origin/master -f

Geändert von @cmcginty's Antwort - ohne das -f funktionierte es bei mir nicht

28voto

BjornSnoen Punkte 303

Als ich das gleiche Problem hatte (zumindest glaube ich, dass es das gleiche Problem ist), habe ich Folgendes getan. Ich ging in das Verzeichnis A und führte aus git init .

Da ich nicht wollte, dass die Dateien im Verzeichnis A von Git verfolgt werden, habe ich .gitignore bearbeitet und die vorhandenen Dateien hinzugefügt. Danach führte ich aus git remote add origin '<url>' && git pull origin master et voíla, B wird ohne einen einzigen Schluckauf in A "geklont".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X