Git-Klon durch SSH


233

Ich habe ein Projekt, für das ich ein Git-Repository erstellt habe:

$ cd myproject  
$ git init  
$ git add .  
$ git commit  

Ich wollte einen nackten Klon auf einem anderen Computer erstellen:

$ cd ..  
$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git  

Ich habe den Klon ausgeführt, aber keine Antwort gedruckt. Ich habe mich am Server angemeldet und versucht zu sehen, wie die Dateien gespeichert sind. Der Pfad / GitRepos war leer, daher habe ich beschlossen, den Klon erneut durchzuführen:

$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git

Diesmal war die Antwort:

fatal: Zielpfad 'ssh: // user @ server: /GitRepos/myproject.git' existiert bereits und ist kein leeres Verzeichnis.

Aber ich sah, dass der Weg leer war.
Was ist denn hier los ?


Ich denke nicht, dass Laufen git clone --baredas tun wird, was du denkst.
Wolfer

3
Für mich hat ssh: // einen Ordner erstellt, anstatt ein Remote-Protokoll zu verwenden. Mit der Antwort von @ alec-the-geek haben die Dinge funktioniert. Würde es Ihnen etwas ausmachen, eine bevorzugte Antwort dafür auszuwählen - es ist Ihre Aufgabe.
Akauppi

1
@akauppi: Es liegt in der Verantwortung des OP, alle Antworten zu berücksichtigen , aber sie sind nicht verpflichtet, eine Antwort auszuwählen, bis sie zufrieden sind. (Natürlich tut es nicht weh, sie daran zu erinnern oder zu fragen, welche weiteren Informationen sie benötigen, damit eine Antwort für sie akzeptabel ist!)
jvriesem

@jvriesem natürlich. Würde jetzt das "es ist dein Job" entfernen. Aber es ist eine alte Sache ... :)
Akauppi

Antworten:


219

Dies hängt möglicherweise nicht direkt mit der Frage zusammen. Ein Fehler, den ich gerade selbst gemacht habe und den ich im OP sehe, ist die URL-Angabe ssh://user@server:/GitRepos/myproject.git- Sie haben sowohl einen Doppelpunkt :als auch einen Schrägstrich, /nachdem dies einen absoluten Pfad bedeutet.

Ich fand dann Git-Klon, ssh: Hostname - Git, Entwicklung - Nicolas Kuttler konnte nicht aufgelöst werden (da dies der Fehler war, den ich in gitVersion 1.7.9.5 erhielt).

Das Problem mit dem Befehl, den ich ursprünglich verwendet habe, war, dass ich versucht habe, eine scp-ähnliche Syntax zu verwenden.

... das war auch mein Problem! Also im Grunde genommen gitmit ssh, verwenden Sie entweder

  • ssh://username@host.xz/absolute/path/to/repo.git/ - Nur ein Schrägstrich für den absoluten Pfad auf dem Server
  • username@host.xz:relative/path/to/repo.git/- nur ein Doppelpunkt (er darf nicht den ssh://relativen Pfad auf dem Server haben (relativ zum Ausgangsverzeichnis usernameauf dem Server)

Hoffe das hilft jemandem,
Prost!


84
Das funktioniert nicht. Wenn Sie mit ssh einen relativen Pfad angeben möchten, müssen Sie das ssh://Präfix verlieren . Ich habe gerade 20 Minuten damit verbracht, das herauszufinden. git clone username@host.xz:relative/path/to/repo.git/sollte arbeiten.
Bobbaluba

2
Versuchte es mit Git 2.1.4 auf einem Debian 8. Beide Vorschläge funktionieren nicht. Beim ersten Versuch wurde unter / GitRepos kein Verzeichnis erstellt, und beim zweiten Versuch wurde beanstandet, dass der Pfad bereits vorhanden war. Genau wie das ursprüngliche Problem gemeldet
dlsa

5
Aufgrund Ihres Kommentars @bobbaluba (und der aktualisierten Antwort) musste ich auch keine 20 Minuten damit verbringen. Vielen Dank!
Olafure

143

Versuchen Sie für Repositorys auf GitHub:

git clone ssh://git@github.com/<user>/<repository name>.git

Informationen zum Einrichten von git zum Klonen über ssh finden Sie unter:


Ist der <Benutzer> mein Benutzername in Github oder meine E-Mail-Adresse für den Github? Da dieser Link mir vorschlägt, die E-Mail-Adresse während der Generierung des öffentlichen Schlüssels zu verwenden. help.github.com/de/github/authenticating-to-github/… Nachdem ich das versucht hatte (leere Passphrase für das SSH-Schlüsselgen), konnte ich Repo immer noch nicht von Github klonen. ps Ich habe dem Agenten den Schlüssel nicht hinzugefügt.
Minnie

Gleiches gilt auch für Gitlab. Zuvor müssen wir das SSH-Schlüssel-Setup aktivieren, wie Sie vorgeschlagen haben
Venkataraman R

45

Sie müssen den Befehl clone auf dem Server ausführen, den Sie aufrufen. Aber ich wette, Sie betreiben keinen SSH-Server auf Ihrem lokalen Client, so dass dies sowieso nicht funktioniert. Schlagen Sie vor, diesen Ansatz zu befolgen (überprüfen Sie das Handbuch, da ich dies aus dem Speicher mache).

  1. Melden Sie sich am Server an.
  2. Erstellen Sie ein nacktes Repo mit git init --bare
  3. Auf dem Client-Computer können Sie Ihr Repo auf den Server übertragen. git remote add origin ssh://user@server:/GitRepos/myproject.gitgefolgt vongit push origin master

Guter Hinweis! Einige Hinweise für Neulinge (wie ich), die sich noch nicht mit reinen Server-Git-Ordnern befasst haben: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git vor dem git init --bare. Sie erhalten hier keine Arbeitskopie - die Repo-Dateien und -Ordner (normalerweise in .git) sind für Sie unverblümt, daher der Name der Flagge. Danke
Akauppi

2
"git init --bare" erstellt kein .git-Verzeichnis. Die Dateien werden direkt in den Ordner gelegt. Beim Hinzufügen des Remote-Ursprungs wird Folgendes angezeigt: "" fatal: Kein Git-Repository (oder ein übergeordnetes Element bis zum Mount-Punkt / Home). An der Dateisystemgrenze anhalten (GIT_DISCOVERY_ACROSS_FILESYSTEM nicht festgelegt).
dlsa

10

Haftungsausschluss: Dies ist nur eine Kopie eines Kommentars von Bobbaluba, der für zukünftige Besucher sichtbarer wird. Es hat mir mehr geholfen als jede andere Antwort.


Sie müssen das ssh://Präfix löschen, wenn Sie es git cloneals Beispiel verwenden

git clone git@github.com:owner/repo.git

5

Versuche dies.

Schritt 1:

ls -al ~/.ssh

Geben Sie hier die Bildbeschreibung ein

Schritt 2:

ssh-keygen 

(Verwenden der Eingabetaste als Standardwert) Geben Sie hier die Bildbeschreibung ein Schritt 3: Einrichten der Konfigurationsdatei

vim /c/Users/Willie/.ssh/config

Host gitlab.com
Hostname gitlab.com
Benutzer git
IdentityFile ~ / .ssh / id_rsa

Schritt 4:

git clone git@gitlab.com:<username>/test2.git

Geben Sie hier die Bildbeschreibung ein

Schritt 5:
Wenn Sie Schritt 4 abgeschlossen haben
1. 1.Die Datei test2.git wird heruntergeladen.
2. Sie erhalten die neue Datei (bekannte_Hosts) in der Datei ~ / .ssh
Geben Sie hier die Bildbeschreibung ein

PS: Ich erstelle die Dateien id_rsa und id_rsa.ub selbst und liefere sie an den Gitlab-Server. Verwenden beider Schlüssel für alle Clientseiten (Windows und Linux).


4

Git 101:

gitist ein dezentrales Versionskontrollsystem. Sie benötigen keinen Server, um mit git arbeiten zu können. Vielleicht möchten Sie das trotzdem tun, da es cool aussieht, oder? (Dies ist auch nützlich, wenn Sie an einem einzelnen Projekt von mehreren Computern aus arbeiten möchten.)

Um einen "Server" zum Laufen zu bringen, müssen Sie ihn ausführen, git init --bare <your_project>.gitda dadurch ein leeres Repository erstellt wird, das Sie dann auf Ihre Computer importieren können, ohne in Konfigurationsdateien in Ihrem .gitVerzeichnis herumspielen zu müssen.

Danach könnten Sie das Repo auf Ihren Clients klonen, da es funktionieren soll, aber ich habe festgestellt, dass einige Clients (nämlich git-gui) ein Repo, das vollständig leer ist, nicht klonen können. Um dies zu umgehen, müssen Sie ausführen cd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master. (Beachten Sie, dass Sie möglicherweise Ihren Benutzernamen und Ihre E-Mail-Adresse für das Git dieses Computers konfigurieren müssen, wenn Sie dies in der Vergangenheit nicht getan haben. Die tatsächlich auszuführenden Befehle befinden sich in der Fehlermeldung, die Sie erhalten, sodass ich sie einfach weglasse.)

An diesem Punkt können Sie das Repository also einfach durch Ausführen auf einen beliebigen Computer klonen git clone <user>@<server>:<relative_path><your_project>.git. (Wie andere bereits erwähnt haben, müssen Sie ihm möglicherweise ein Präfix voranstellen, ssh://wenn Sie den absoluten Pfad verwenden.) Dies setzt voraus, dass Sie sich bereits von Ihrem Client beim Server anmelden können. (Sie erhalten auch Bonuspunkte für das Einrichten einer Konfigurationsdatei und von Schlüsseln für ssh, wenn Sie beabsichtigen, viele Dinge auf den Remote-Server zu übertragen.)

Einige relevante Links:
Hier erfahren Sie ziemlich genau, was Sie wissen müssen.
Und dies ist für diejenigen, die die Grundfunktionen von Git kennen, aber manchmal die genaue Syntax vergessen.


Beide Links scheinen nun tot zu sein oder zeigen nicht, was Sie erwartet haben.
Todd

2

Ich möchte eine Antwort versuchen, die Git-Flow und drei "Punkte" oder Anwendungsfälle, das zentrale Git-Repository, die lokale Entwicklung und die Produktionsmaschine enthält. Dies ist nicht gut getestet .

Ich gebe unglaublich spezifische Befehle. Anstatt zu sagen <your folder>, werde ich sagen /root/git. Der einzige Ort, an dem ich den ursprünglichen Befehl ändere, ist das Ersetzen meines spezifischen Servernamens durch example.com. Ich werde den Zweck des Ordners erläutern, damit Sie ihn entsprechend anpassen können. Bitte lassen Sie mich über Verwirrung wissen und ich werde die Antwort aktualisieren.

Die Git-Version auf dem Server ist 1.7.1. Der Server ist CentOS 6.3 (Final).

Die Git-Version auf dem Entwicklungscomputer ist 1.8.1.1. Dies ist Mac OS X 10.8.4.

Das zentrale Repository und die Produktionsmaschine befinden sich auf derselben Maschine.

Das zentrale Repository, auf das SVN-Benutzer als "Server" verweisen können, ist wie folgt konfiguriert. Ich habe einen Ordner, /root/gitin dem ich alle meine Git-Repositorys aufbewahre. Ich möchte ein Git-Repository für ein Projekt erstellen, das ich "Blumen" nenne.

cd /root/git
git clone --bare flowers flowers.git

Der Befehl git gab zwei Meldungen aus:

Initialized empty Git repository in /root/git/flowers.git/
warning: You appear to have cloned an empty repository.

Nichts, über das man sich sorgen sollte.

Auf dem Entwicklungscomputer ist wie folgt konfiguriert. Ich habe einen Ordner, /home/kinjal/Sitesin dem ich alle meine Projekte ablege. Ich möchte jetzt das zentrale Git-Repository erhalten.

cd /home/kinjal/Sites
git clone root@example.net:/root/git/flowers.git

Dies bringt mich zu einem Punkt, an dem ich anfangen kann, Dinge hinzuzufügen. Ich habe zuerst den Git Flow eingerichtet

git flow init -d

Standardmäßig ist dies ein Zweig develop. Ich füge jetzt hier meinen Code hinzu. Dann muss ich mich auf das zentrale Git-Repository festlegen.

git add .
git commit -am 'initial'
git push

Zu diesem Zeitpunkt drängte es auf den Entwicklungszweig. Ich möchte dies auch zum Hauptzweig hinzufügen.

git flow release start v0.0.0 develop
git flow release finish v0.0.0
git push

Beachten Sie, dass ich zwischen dem Start und dem Ende der Veröffentlichung nichts getan habe. Und als ich die Veröffentlichung beendet hatte, wurde ich aufgefordert, zwei Dateien zu bearbeiten. Dies brachte den Entwicklungszweig zum Master.

Auf der Produktionsstätte, die sich auf demselben Computer wie mein zentrales Git-Repository befindet, möchte ich das Repository ablegen /var/www/vhosts/example.net. Ich habe bereits /var/www/vhosts.

cd /var/www/vhosts
git clone file:///root/git/flowers.git example.net

Wenn sich die Produktionsmaschine auch auf einer anderen Maschine befinden würde, würde der git cloneBefehl wie der auf der Entwicklungsmaschine verwendete aussehen.


1

Im Voraus fehlen mir ein bisschen meine GIT-Fähigkeiten.

Dadurch wird ein nacktes Repository auf Ihrem Computer geklont, das nur die Ordner enthält, in .gitdenen sich ein verstecktes Verzeichnis befindet. ausführen ls -alund Sie sollten sehen .gitodercd .git in Ihrem Repository.

Können Sie eine Beschreibung Ihrer Absicht hinzufügen, damit jemand mit mehr GIT-Kenntnissen helfen kann? Was möchten Sie wirklich tun, nicht wie Sie es vorhaben?


Ich habe den Befehl falsch interpretiert. Ich habe einen Unterverzeichnisbaum ssh: /myproject.git unter dem aktuellen Verzeichnis erstellt. Ich dachte, ich würde in ein Remote-Verzeichnis klonen, aber der Befehl klont wirklich aus einem Repository.
dlsa

0

Ich habe: git clone --bare "/ GITREPOSITORIES / RepoA" "ssh: // luc @ EERSTENASDS119J / volume1 / RepoA" Ergebnis: fatal: Zielpfad 'ssh: // luc @ EERSTENASDS119J / volume1 / RepoA' existiert bereits und ist kein leeres Verzeichnis.

Das System hat in meinem aktuellen Pfad ein Verzeichnis ssh: // luc @ EERSTENASDS119J / volume1 / RepoA erstellt.

Der Git-Klon hat die URL-Spezifikation also nicht interpretiert. Verwendete die Problemumgehung von Alec.


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.