So bringen Sie Git dazu, in das aktuelle Verzeichnis zu klonen


499

Ich mache:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git ./

Ich erhalte:

Schwerwiegend: Zielpfad '.' existiert bereits und ist kein leeres Verzeichnis.

Ich kenne den Weg. ist bereits vorhanden. Und ich kann versichern, dass das Verzeichnis leer ist. (Ich bin drinnen und sehe nichts!)

Was fehlt mir hier, um das Projekt in das aktuelle Verzeichnis zu klonen?


16
Wenn Sie dies ls -atun, sehen Sie ein .gitVerzeichnis?
Davin Tryon

2
@dtryon - Nein. Aber ich sehe einen DS_Store, was auch immer das ist. Vielleicht sollte ich es loswerden. Danke dafür -a: s
MEM

@Danke vier Ihre schnelle Antwort. James Maclaughlin, das scheint ein schöner Befehl zu sein, um sicherzustellen, dass wir in ein leeres Verzeichnis klonen. :)
MEM

1
Ich gehe davon aus, dass Sie auf einem Mac sind . Hilft dies: stackoverflow.com/questions/107701/…
Davin Tryon

Für jeden Ordner, den Sie auf einem Mac durchsuchen, werden diese kleinen Dateien dort erstellt. Es ist sehr ärgerlich für beide Windows-Benutzer, die dieselben Freigaben verwenden, und für jedes System (z. B. Git), bei dem die Ordner leer sein müssen oder das programmgesteuert Aktionen für jede Datei in einem Ordner ausführt.
jsims281

Antworten:


509

Setzen Sie einfach einen Punkt daneben

git clone git@github.com:user/my-project.git .

Von git help clone:

Das Klonen in ein vorhandenes Verzeichnis ist nur zulässig, wenn das Verzeichnis leer ist.

Stellen Sie also sicher, dass das Verzeichnis leer ist (überprüfen Sie mit ls -a), da sonst der Befehl fehlschlägt.


18
Beachten Sie, dass auf einem Mac eine vom Finder automatisch erstellte .DS_Store-Datei den Klon blockiert. erkundigen Sie sich beils -la
ptim

281
Nee. Dies ist nicht die richtige Antwort. Dies würde immer noch "fatal: Zielpfad" zurückgeben. existiert bereits und ist kein leeres Verzeichnis. "
Sid Sarasvati

16
Funktioniert für mich mit git v1.8.3.2. @SidSarasvati Sind Sie sicher, dass das aktuelle Verzeichnis leer ist ?
Wesley Baugh

3
@SidSarasvati Nun, für mich ist das Directoy nicht leer, aber das interessiert mich nicht, deshalb bin ich mir nicht sicher, warum Git das tun würde. Warum kann git nicht in ein nicht leeres Verzeichnis klonen? Funktionell ist es sicherlich nur ein einfacher Download.
Nathan Hornby

3
mkdirErstellt Hardlinks zu .und ..standardmäßig. Ist ein neues Verzeichnis in Unix-basierten Systemen überhaupt technisch "leer"? Ich meine, ich denke du könntest unlink .und unlink ..aber das könnte dir später große Probleme bereiten, wenn du vergisst, nach dem Klonen wieder eine Verknüpfung
herzustellen

351

Das Folgende entspricht wahrscheinlich nicht in allen Fällen einem Klon, hat aber den Trick für mich getan:

git init .
git remote add -t \* -f origin <repository-url>
git checkout master

In meinem Fall wird eine .git/configDatei erstellt, die der Datei entspricht, die ich beim Klonen erhalte.


40
Darüber hinaus ist dies die Beschwörung, mit der der aktuelle Inhalt erhalten bleibt - beispielsweise, wenn Sie Ihre Punktedateien in Ihr Home-Verzeichnis klonen.
Rbellamy

7
Damit darf ich endlich in einen beliebigen Ordner klonen, ohne dass Git mich wie ein Baby behandelt. Wenn ich auch einen temporären .gitignore hinzufügte, der *(alles ignorieren) enthielt , konnte ich ausführen git checkout master, obwohl sich bereits einige andere Dateien im Ordner befanden . Dann wurden alle festgeschriebenen Dateien aus dem Repository geklont (und der temporäre Gitignore wurde durch den richtigen Gitignore aus dem Repo überschrieben). Es hat alles wunderbar funktioniert. Es sollte auf diese Weise von selbst durch Verwendung von git clone -foder etwas geschehen .
PaulMag

1
Wenn Sie Dateien haben, die anders / neu / geändert sind und überschrieben werden (... Dateien würden durch Auschecken überschrieben ... Abbrechen), verwenden Sie: git checkout master -f
visualex

3
Das -t \*ist unnötig, da es die Standardeinstellung ist.
Palec

1
git remote set-head origin -akönnte nützlich sein. Es legt den Standardzweig ( refs/remotes/origin/HEAD) von origin fest, wie er im Remote-Repository festgelegt ist. git clonetut dies im Gegensatz zu automatisch git remote add -f.
Palec

212

@ Andrew hat es hier klar beantwortet . So einfach funktioniert das aber auch, wenn das Verzeichnis nicht leer ist:

git init .
git remote add origin <repository-url>
git pull origin master

Ich bin froh zu bestätigen, dass es <repository-url>sich auch um ein lokales Repo handeln kann, dagit remote add origin /path/to/existing/repo
krubo

60

Um sicherzugehen, dass Sie das Repo klonen können, wechseln Sie in ein beliebiges temporäres Verzeichnis und klonen Sie das Projekt dort:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git

Dadurch werden Ihre Inhalte in ein project_hubVerzeichnis geklont .

Sobald das Klonen abgeschlossen ist, können Sie dieses Verzeichnis beliebig verschieben:

mv project_hub /path/to/new/location

Dies ist sicher und erfordert keine magischen Dinge.


9
Dadurch wird ein Unterverzeichnis im bereits vorhandenen /path/to/new/locationVerzeichnis erstellt, was sicherlich nicht der Punkt der Frage ist.
Pavel Šimerda

Dann müssen Sie die versteckten Dateien manuell verschieben oder einen komplizierten Befehl verwenden ... und die Frage wird nicht beantwortet.
Schwarzer



15

Hmm ... die Angabe des absoluten Strompfades mit $(pwd)hat bei mir funktioniert.

git clone https://github.com/me/myproject.git $(pwd)

Git-Version: 2.21.0


13

Wenn das aktuelle Verzeichnis leer ist, funktioniert dies:

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo

1
In meinem Fall funktionierte es sogar mit einigen Dateien im '.' Verzeichnis
OSdave

2
Beachten Sie, dass alle Punktedateien in Verzeichnissen unter foo, z. foo / bar / .foobar wird mit diesem Befehl nicht verschoben. Siehe die Antwort von @phatblat
lea

10

Zusätzlich zur Antwort von @ StephaneDelcroix, bevor Sie Folgendes verwenden:

git clone git@github.com.user/my-project.git .

Stellen Sie sicher, dass Ihr aktuelles Verzeichnis leer ist, indem Sie verwenden

ls -a

Konfrontiert mit diesem Problem heute. Es stellte sich heraus, dass ich die Ordner .git und .gitignore in dem Verzeichnis versteckt hatte, in das ich das Repository klonen wollte. Als ich diese Ordner entfernte, war alles in Ordnung.
Tamara

Was wäre ein Befehl, um das aktuelle Verzeichnis zu leeren? Ich denke, das wäre nützlicher als nur zu überprüfen :)
pie6k

9

Lösung: In diesem Fall verwendete die Lösung Folgendes dot:rm -rf .* && git clone ssh://user@host.com/home/user/private/repos/project_hub.git .

rm -rf .* && kann weggelassen werden, wenn wir absolut sicher sind, dass das Verzeichnis leer ist.

Credits gehen an: @James McLaughlin auf Kommentare unten.


10
Das sieht böse aus, da. * Das übergeordnete Verzeichnis enthält! ich: ~ / tmp / tmp / tmp $ ls -d .* . .. ich: ~ / tmp / tmp / tmp $
stackunderflow

Dies hilft nicht, da ich Abhängigkeiten in dem Verzeichnis habe, in dem ich auschecken muss.
B01

18
Ich bin mir nicht sicher, ob es sinnvoll ist, rm -rf (in irgendeiner Form) in eine SO-Antwort ohne ein WIRKLICH beängstigendes Warnzeichen zu schreiben. Einige unerfahrene Benutzer könnten hierher kommen, um nach dem "grünen Häkchen" zu suchen (normalerweise die beste Antwort) und dann diesen Befehl kopieren und kopieren ... da geht seine harte Arbeit in das aktuelle Verzeichnis. Übrigens: rm -rf ./.*ist "sicherer", wenn Sie nur die versteckten (Punkt-) Dateien und Verzeichnisse unter dem aktuellen Verzeichnis entfernen (genau wie @stackunderflow vor mir angegeben hat). Aber rm -rfist ein gefährlicher Befehl für die unerfahrenen Benutzer, seien Sie also vorsichtig damit! Nur meine 2 Cent.
Andrew

funktioniert am 1.7.1 Der einzige Ordner im Inneren war .gitnach git init(ich wusste es)
vladkras

Sie müssen keine -rfnormalen Dateien löschen. Bitte erwägen Sie, diese Antwort zu löschen oder zumindest eine andere zu akzeptieren.
Navin

6

Verbesserung der Antwort von @ GoZoner:

git clone <repository> foo; shopt -s dotglob nullglob; mv foo/* .; rmdir foo

Der Befehl shopt wird aus dieser SO-Antwort übernommen und ändert das Verhalten des Befehls 'mv' in Bash so, dass Punktdateien eingeschlossen werden, die das Verzeichnis .git und alle anderen versteckten Dateien enthalten müssen.

Beachten Sie auch, dass dies garantiert nur so funktioniert, wie es ist, wenn das aktuelle Verzeichnis (.) Leer ist. Es funktioniert jedoch, solange keine der Dateien im geklonten Repo denselben Namen wie die Dateien im aktuellen Verzeichnis hat. Wenn es Ihnen egal ist, was sich im aktuellen Verzeichnis befindet, können Sie dem Befehl 'mv' die Option -f (force) hinzufügen.


6

Ich hatte das gleiche Bedürfnis. In meinem Fall hatte ich einen Standard-Webordner, der von einer Webserver-Installation erstellt wurde. Für die Zwecke dieser Abbildung nehmen wir an, dass dies so ist

/server/webroot

und webroot enthält andere Standarddateien und -ordner. Mein Repo enthält nur die ortsspezifischen Dateien (HTML, Javascript, CFML usw.).

Alles was ich tun musste war:

cd /server/webroot

git init

git pull [url to my repo.git]

Sie müssen vorsichtig sein, um die Git-Init im Zielordner auszuführen, denn wenn Sie dies NICHT tun, geschieht eines von zwei Dingen:

  1. Der Git-Pull schlägt in meinem Fall einfach mit einer Meldung fehl, dass keine Git-Datei vorhanden ist:

fatal: Kein Git-Repository (oder eines der übergeordneten Verzeichnisse): .git

  1. Wenn sich irgendwo im übergeordneten Pfad zu Ihrem Ordner eine .git-Datei befindet, wird Ihr gezogenes Repo in DIESEM übergeordneten Ordner erstellt, der die .git-Datei enthält. Das ist mir passiert und ich war überrascht ;-)

Dies hat KEINE der "Standard" -Dateien in meinem Webroot-Ordner gestört, aber ich musste sie zur .gitignore-Datei hinzufügen, um zu verhindern, dass sie versehentlich zu nachfolgenden Commits hinzugefügt werden.

Dies scheint eine einfache Möglichkeit zu sein, in ein nicht leeres Verzeichnis zu "klonen". Wenn Sie nicht möchten, dass die durch das Pull erstellten .git- und .gitignore-Dateien einfach nach dem Pull gelöscht werden.


5

Weitere Verbesserung der Antwort von @ phatblat :

git clone --no-checkout <repository> tmp \
  && mv tmp/.git . \
  && rmdir tmp \
  && git checkout master

als ein Liner:

git clone --no-checkout <repository> tmp && mv tmp/.git . && rmdir tmp && git checkout master


2
shopt -s dotglob
git clone ssh://user@host.com/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp

3
Geben Sie weitere Informationen an, um zu erklären, warum Ihr Code das Problem behebt und was er bewirkt.
Martin

"git clone ... tmp" - Erstellt den Ordner / tmp in dem Verzeichnis, in dem der Befehl ausgeführt wird, und klont das Git-Repository. Dann "mv tmp / *". - verschiebt alle Dateien aus dem Ordner / tmp in den übergeordneten Ordner (wo der vorherige Befehl ausgeführt wurde) und schließlich "rm -rf tmp" - entfernt den Ordner / tmp.
Marinski

1

Verwenden Sie. (Punkt) am Ende Ihres Befehls wie unten

Git-Klon- URL .


Dies funktioniert nicht auf Mac, es verursacht Fehler: fatal: destination path '.' already exists and is not an empty directory.
Pedro Luz

Für mac :: Sie sollten sich unter dem übergeordneten Verzeichnis befinden und dann den Ordnernamen anstelle von. (Punkt) wie unten verwenden. Git clone URL flodername Stellen Sie sicher, dass Ihr Ordner leer ist.
Upendra

0

Folgendes habe ich gefunden:

Ich sehe es:

fatal: destination path 'CouchPotatoServer' already exists and is not an empty directory.

Bei meinen Suchen bin ich auf Folgendes gestoßen:

https://couchpota.to/forum/viewtopic.php?t=3943

Suchen Sie nach dem Eintrag von Clinton.Hall ... Wenn Sie dies versuchen (wie ich), werden Sie wahrscheinlich die bekommen access denied Antwort erhalten, es gab meinen ersten Hinweis, so dass der anfängliche Fehler (für mich) tatsächlich der falschen Wurzel entging Problem.

Lösung für dieses Problem in Windows: Stellen Sie sicher, dass Sie cmdoder ausführen git elevated, und führen Sie dann Folgendes aus:

git clone https://github.com/RuudBurger/CouchPotatoServer.git

Das Obige war mein Problem und das einfache Erhöhen hat für mich funktioniert.


0

Die Lösung für Windowsbesteht darin, das Repository in einen anderen Ordner zu klonen und dann zu kopieren und an den ursprünglichen Speicherort einzufügen oder einfach den .gitunsichtbaren Ordner zu kopieren .


-1

Entfernen mit

rm -rf. *

kann Sie in Schwierigkeiten oder weitere Fehler bringen.

Wenn Sie den Ordner / path / to / haben und alles darin entfernen möchten, aber nicht diesen Ordner, führen Sie einfach Folgendes aus:

rm -rf / path / to / folder / *


-1

Also habe ich diesen Fehler behoben, indem ich den versteckten .git-Ordner in meinem Stammverzeichnis gelöscht und dann dem 'git clone repo' einen Punkt hinzugefügt habe. in meinem root / dist Ordner. Dies steht im Zusammenhang mit einem vue-cli-Webpack-Projekt. Was alle anderen sagen, ist richtig. Normalerweise bedeutet dies, dass Sie Git-Tracking entweder in dem Ordner haben, in den Sie klonen möchten, oder in dem übergeordneten Ordner oder Stammverzeichnis des betreffenden Ordners!


-1
git clone ssh://user@host.com/home/user/private/repos/project_hub.git $(pwd)

Beachten Sie, dass dies immer noch zu demselben Fehler führt, der in der Frage (" fatal: Zielpfad 'behoben / Pfad / von / pwd' ist bereits vorhanden und kein leeres Verzeichnis. ") Angegeben wird, wenn Sie dies in einem nicht leeren Verzeichnis tun Verzeichnis.
Gino Mempin


-2

Es ist nützlich, eine neue Datei zu erstellen, indem Sie mkdir filenameden Befehl git clone xxxxxausführen und auf meinem Computer funktionieren


-3

Ich habe diese Frage so oft gesehen - und ich möchte nur darauf hinweisen git pull aus Ihrem Verzeichnis heraus den Trick macht.

Es sei denn, ich vermisse hier etwas - das hat bei mir funktioniert.


5
git pullwird nichts tun, wenn Sie kein Repository definiert haben, was ein kritischer Teil dessen ist, was git clonetut.
Hackel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.