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 ?

5voto

Roberto Aloi Punkte 29588

Vielleicht habe ich Ihre Frage falsch verstanden, aber wäre es nicht einfacher, wenn Sie die Dateien von A in das Git Repo B kopieren/verschieben und die benötigten Dateien mit Git hinzufügen ?

UPDATE: Aus der Git-Dokumentation:

Das Klonen in ein bestehendes Verzeichnis ist nur erlaubt, wenn das Verzeichnis leer ist.

QUELLE: http://git-scm.com/docs/git-clone

5voto

Philip Kirkbride Punkte 19451

Ich tue Folgendes:

git clone repo /tmp/folder
cp -rf /tmp/folder/.git /dest/folder/
cd /dest/folder
git checkout -f master

4voto

RODNEY ZHANG Punkte 153

Das funktioniert bei mir, aber Sie sollten die Dateien des entfernten Repositorys mit den lokalen Dateien zusammenführen:

git init
git remote add origin url-to-git
git branch --set-upstream-to=origin/master master
git fetch
git status

3voto

Lendrick Punkte 897

Ich war auf der Suche nach etwas Ähnlichem, und hier ist das, was ich gefunden habe:

In meiner Situation habe ich einen aktiven Web-Tree, für den ich ein entferntes Repository erstellen wollte, ohne die Dateien im aktuellen Web-Tree zu verschieben. Das habe ich getan:

  1. Rufen Sie den Webbaum auf und führen Sie git init
  2. Gehen Sie zum gewünschten Ort des Repositorys und führen Sie es aus: git clone --bare /path/to/web/repo
  3. Bearbeiten Sie die Konfigurationsdatei in meinem entfernten Repo und entfernen Sie die [remote "origin"] Abschnitt.
  4. Hinzufügen einer [remote "origin"] Abschnitt zu .git/config im Webbaum, der auf das neue entfernte Projektarchiv zeigt.

3voto

Ich war auf der Suche nach einer anderen Frage, als ich hierüber stolperte: Wie kann man in ein bestehendes Verzeichnis klonen, in dem die Dateien nicht vorhanden sind?

Jedenfalls habe ich genau das vor kurzem für einige nicht quellkontrollierte Kopien von Dateien auf einigen Servern getan.

cd <target directory>
git init
git remote add origin <repository URI>
git fetch
git branch -f master origin/master
git reset
git show HEAD:.gitignore > .gitignore

Dies:

  • Initialisiert ein leeres Repo-Verzeichnis für Sie
  • Fügt ein Remote-Repository für das Repository hinzu, mit dem Sie sich verbinden wollen
  • Ruft den Inhalt des Repository-Ordners (/.git) ab
  • Erzwingt die Standardverzweigung von git init um Herkunft/Master zu verfolgen
  • hebt alle durch den Fetch erzeugten Änderungen auf (ich verstehe den Mechanismus zum Bereitstellen aller Dateien auf fetch )
  • Kopien in die .gitignore-Datei des Repositorys (die Sie benötigen, wenn Sie es verwenden wollen)

Die Antwort auf meine Frage war die git reset --hard HEAD in der Antwort von Dale Forester.

Alternative Anweisungen für beliebige Verzweigungen und entfernte Namen

git init
git remote add <remotename> <repository URI>
git checkout -b <localbranchname>
git fetch <remotename> <remotebranchname>
git branch -f <localbranchname> <remotename>/<remotebranchname>
git reset
git show HEAD:.gitignore > .gitignore

Wie oben beschrieben, ist dies der Fall:

  • Initialisiert ein leeres Repo-Verzeichnis für Sie
  • Fügt ein Remote-Repository für das Repository hinzu, mit dem Sie sich verbinden wollen
  • Legt den Namen des lokalen Zweigs fest. Optional, aber empfohlen, um die Verzweigungen übersichtlich zu halten, wenn Sie mehr als eine Verzweigung in der gleichen Umgebung durchführen
  • Ruft den Inhalt des Repository-Ordners (/.git) ab
  • Erzwingt die lokale Verzweigung von git checkout -b <localbranchname> zu verfolgen <remote>/<remotebranchname>
  • hebt alle durch den Fetch erzeugten Änderungen auf (ich verstehe den Mechanismus zum Bereitstellen aller Dateien auf fetch )
  • Kopien in die .gitignore-Datei des Repositorys (die Sie benötigen, wenn Sie es verwenden wollen)

Wenn Sie am Ende dieses Vorgangs einen Git-Status ausführen, sehen Sie unstaged changes für alle Dateien im aktuellen Verzeichnis (dem Arbeitsverzeichnis), unabhängig davon, ob das Arbeitsverzeichnis etwas mit der Repository-Struktur zu tun hat oder nicht.

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