Wie erstelle ich ein Remote-Git-Repository aus einem lokalen?

243

Ich habe ein lokales Git-Repository. Ich möchte es auf einem entfernten, SSH-fähigen Server verfügbar machen. Wie mache ich das?

Nips
quelle

Antworten:

287

Ich denke, Sie erstellen ein nacktes Repository auf der Remote-Seite, git init --barefügen die Remote-Seite als Push / Pull-Tracker für Ihr lokales Repository hinzu ( git remote add origin URL) und sagen dann lokal einfach git push origin master. Jetzt kann jedes andere Repository pullaus dem Remote-Repository.

Kerrek SB
quelle
@ Nips: Ja, richtig, sorry. Sie schieben tatsächlich einzelne Zweige!
Kerrek SB
Was ist, wenn ich die GUI verwende? Wie kann ich einen Server für alle Repositorys einrichten und jeden PC im selben Netzwerk mit diesem verbinden?
SearchForKnowledge
4
Wenn der git push origin masterFehler "Repository nicht gefunden" fehlschlägt, versuchen Sie es git update-server-infoauf der Remote-Seite, wo Sie es getan habengit init --bare
HongKilDong
7
@ KerrekSB ist es möglich, automatisch ein nacktes Repo auf dem Server zu erstellen, sobald ich Git Push Origin Master auf meinem lokalen
ANinJa
@ HongKilDong Ich habe es versucht, git update-server-infoaber ich bekomme den Fehler fatal: Unable to look up Volumes (port 9418) (nodename nor servname provided, or not known)
Nayef
81

Um zunächst einen Git-Server einzurichten, müssen Sie ein vorhandenes Repository in ein neues nacktes Repository exportieren - ein Repository, das kein Arbeitsverzeichnis enthält. Dies ist im Allgemeinen unkompliziert. Um Ihr Repository zu klonen und ein neues nacktes Repository zu erstellen, führen Sie den Befehl clone mit der --bareOption aus. Konventionell enden nackte Repository-Verzeichnisse .gitwie folgt:

$ git clone --bare my_project my_project.git
Initialized empty Git repository in /opt/projects/my_project.git/

Dieser Befehl verwendet das Git-Repository für sich, ohne ein Arbeitsverzeichnis, und erstellt ein Verzeichnis speziell für dieses Verzeichnis.

Nachdem Sie eine Kopie Ihres Repositorys haben, müssen Sie es nur noch auf einen Server stellen und Ihre Protokolle einrichten. Angenommen, Sie haben einen Server eingerichtet git.example.com, auf den Sie SSH-Zugriff haben, und Sie möchten alle Ihre Git-Repositorys im /opt/gitVerzeichnis speichern . Sie können Ihr neues Repository einrichten, indem Sie Ihr nacktes Repository über Folgendes kopieren:

$ scp -r my_project.git [email protected]:/opt/git

Zu diesem Zeitpunkt können andere Benutzer, die SSH-Zugriff auf denselben Server haben, der Lesezugriff auf das /opt/gitVerzeichnis hat, Ihr Repository durch Ausführen klonen

$ git clone [email protected]:/opt/git/my_project.git

Wenn ein Benutzer SSHs auf einem Server hat und Schreibzugriff auf das /opt/git/my_project.gitVerzeichnis hat, hat er automatisch Push-Zugriff. Git fügt einem Repository automatisch ordnungsgemäß Gruppenschreibberechtigungen hinzu, wenn Sie den Befehl git init mit der --sharedOption ausführen .

$ ssh [email protected]
$ cd /opt/git/my_project.git
$ git init --bare --shared

Es ist sehr einfach, ein Git-Repository zu erstellen, eine Bare-Version zu erstellen und es auf einem Server zu platzieren, auf den Sie und Ihre Mitarbeiter SSH-Zugriff haben. Jetzt können Sie an demselben Projekt zusammenarbeiten.

Binoy Babu
quelle
6
Die scpLösung funktioniert IMO in der Praxis besser als die init --bare. Es fühlt sich immer noch wie ein hässlicher Hack an, zuerst lokal zu klonen, dann auf den Server zu kopieren ... wünschte, Git hätte einen Befehl, dies auf einmal zu tun.
links um den
1
+ 1'd dieses, weil --sharedfür mich gearbeitet hat. Ich frage mich, was passiert, wenn Sie verwenden, git init --sharedohne eine --barezu machen ...
Eiswasser
1
Erstellen Sie lokal ein nacktes Repository, und scpdas für eine Fernbedienung funktioniert besser, wenn die Fernbedienung dies nicht unterstützt git init --bare(wie es bei mir mit Git 1.5.5, 2008 der Fall war). Ich denke, das sollte funktionieren, auch wenn die Fernbedienung überhaupt keinen Git hat.
Jaroslaw Nikitenko
1
Referenz: git-scm.com/book/en/v1/…
berbt
1
Ein kleiner Hinweis: Der Schritt scp der Lösung ist korrekt, funktioniert jedoch, wenn der Remote-Benutzer eine reguläre Shell hat. Wenn der Benutzer eine Git-Shell verwendet, funktioniert dies nicht.
user1708042
9

Ein Hinweis für Personen, die die lokale Kopie unter Windows erstellt haben und ein entsprechendes Remote-Repository auf einem Unix-Line-System erstellen möchten, bei dem Textdateien LF-Endungen auf weiteren Klonen von Entwicklern auf Unix-ähnlichen Systemen erhalten, CRLF-Endungen jedoch unter Windows.

Wenn Sie Ihr Windows-Repository erstellt haben, bevor Sie die Übersetzung am Zeilenende eingerichtet haben, liegt ein Problem vor. Die Standardeinstellung von Git ist keine Übersetzung, daher verwendet Ihr Arbeitssatz CRLF, aber Ihr Repository (dh die unter .git gespeicherten Daten) hat die Dateien auch als CRLF gespeichert.

Wenn Sie auf die Fernbedienung drücken, werden die gespeicherten Dateien unverändert kopiert, und es erfolgt keine Übersetzung am Zeilenende. (Die Übersetzung am Zeilenende erfolgt, wenn Dateien in ein Repository übernommen werden, nicht, wenn Repositorys übertragen werden.) Sie landen mit CRLF in Ihrem Unix-ähnlichen Repository, was nicht das ist, was Sie wollen.

Um LF in das Remote-Repository zu laden, müssen Sie sicherstellen, dass sich LF zuerst im lokalen Repository befindet, indem Sie Ihr Windows-Repository neu normalisieren . Dies hat keine sichtbaren Auswirkungen auf Ihren Windows-Arbeitssatz, der immer noch CRLF-Endungen hat. Wenn Sie jedoch auf Remote drücken, erhält die Fernbedienung LF korrekt.

Ich bin mir nicht sicher, ob es eine einfache Möglichkeit gibt, festzustellen, welche Zeilenenden sich in Ihrem Windows-Repository befinden. Ich denke, Sie können dies testen, indem Sie core.autocrlf = false setzen und dann klonen (Wenn das Repo LF-Endungen hat, hat der Klon LF auch).

user1804620
quelle
5

Es gibt einen interessanten Unterschied zwischen den beiden oben genannten gängigen Lösungen:

  1. Wenn Sie das nackte Repository wie folgt erstellen:

    cd / external_of_any_repo
    mkdir my_remote.git
    cd my_remote.git
    git init --bare
    

und dann

cd  /your_path/original_repo
git remote add origin /outside_of_any_repo/my_remote.git
git push --set-upstream origin master

Dann richtet git die Konfiguration in 'original_repo' mit dieser Beziehung ein:

original_repo origin --> /outside_of_any_repo/my_remote.git/

mit letzterem als Upstream-Fernbedienung. Und die Upstream-Fernbedienung hat keine anderen Fernbedienungen in ihrer Konfiguration.

  1. Wenn Sie es jedoch umgekehrt machen:

    (aus dem Verzeichnis original_repo)
    cd ..
    Git-Klon --bare original_repo /outside_of_any_repo/my_remote.git
    

Dann endet 'my_remote.git' mit seiner Konfiguration, deren 'Ursprung' auf 'original_repo' als Remote verweist, wobei eine remote.origin.url dem lokalen Verzeichnispfad entspricht, was möglicherweise nicht geeignet ist, wenn sie verschoben werden soll zu einem Server.

Während diese "Remote" -Referenz später leicht entfernt werden kann, wenn sie nicht angemessen ist, muss 'original_repo' immer noch so eingerichtet werden, dass sie auf 'my_remote.git' als Upstream-Remote verweist (oder wohin sie auch geht) geteilt werden von). Technisch gesehen können Sie mit Ansatz 2 mit ein paar weiteren Schritten zum gleichen Ergebnis gelangen. # 1 scheint jedoch ein direkterer Ansatz zu sein, um ein "zentrales nacktes gemeinsames Repo" zu erstellen, das von einem lokalen Repo stammt und für den Wechsel auf einen Server mit weniger Schritten geeignet ist. Ich denke, es hängt von der Rolle ab, die das Remote-Repo spielen soll. (Und ja, dies steht im Widerspruch zur Dokumentation hier .)

Vorsichtsmaßnahme: Ich habe das oben Genannte gelernt (bei diesem Schreiben Anfang August 2019), indem ich einen Test auf meinem lokalen System mit einem echten Repo durchgeführt und dann einen Datei-für-Datei-Vergleich zwischen den Ergebnissen durchgeführt habe. Aber! Ich lerne noch, also könnte es einen korrekteren Weg geben. Aber meine Tests haben mir geholfen zu folgern, dass # 1 meine derzeit bevorzugte Methode ist.

V. Wheeler
quelle
4

Ein Remote-Repository ist im Allgemeinen ein nacktes Repository - ein Git-Repository ohne Arbeitsverzeichnis. Da das Repository nur als Kollaborationspunkt verwendet wird, gibt es keinen Grund, einen Snapshot auf der Festplatte auschecken zu lassen. Es sind nur die Git-Daten. Im einfachsten Sinne ist ein nacktes Repository der Inhalt des .git-Verzeichnisses Ihres Projekts und nichts anderes.

Sie können ein Bare-Git-Repository mit dem folgenden Code erstellen:

$ git clone --bare /path/to/project project.git

Eine Option für ein Remote-Git-Repository ist die Verwendung des SSH-Protokolls:

Ein gängiges Transportprotokoll für Git, wenn Self-Hosting über SSH erfolgt. Dies liegt daran, dass der SSH-Zugriff auf Server an den meisten Orten bereits eingerichtet ist - und wenn dies nicht der Fall ist, ist dies einfach. SSH ist auch ein authentifiziertes Netzwerkprotokoll. Da es allgegenwärtig ist, ist es im Allgemeinen einfach einzurichten und zu verwenden.

Um ein Git-Repository über SSH zu klonen, können Sie eine ssh://URL wie folgt angeben :

$ git clone ssh://[user@]server/project.git

Oder Sie können die kürzere scp-ähnliche Syntax für das SSH-Protokoll verwenden:

$ git clone [user@]server:project.git

Wenn Sie in beiden oben genannten Fällen den optionalen Benutzernamen nicht angeben, geht Git von dem Benutzer aus, als den Sie derzeit angemeldet sind.

Die Profis

Die Vorteile der Verwendung von SSH sind vielfältig. Erstens ist SSH relativ einfach einzurichten - SSH-Daemons sind an der Tagesordnung, viele Netzwerkadministratoren haben Erfahrung mit ihnen und viele Betriebssystemverteilungen werden mit ihnen eingerichtet oder verfügen über Tools, um sie zu verwalten. Als nächstes ist der Zugriff über SSH sicher - die gesamte Datenübertragung wird verschlüsselt und authentifiziert. Wie die Protokolle HTTPS, Git und Local ist SSH effizient und macht die Daten vor der Übertragung so kompakt wie möglich.

Die Nachteile

Der negative Aspekt von SSH ist, dass es keinen anonymen Zugriff auf Ihr Git-Repository unterstützt. Wenn Sie SSH verwenden, müssen Benutzer über SSH-Zugriff auf Ihren Computer verfügen, auch wenn dieser schreibgeschützt ist. Dies macht SSH nicht für Open Source-Projekte geeignet, für die Benutzer möglicherweise einfach Ihr Repository klonen möchten, um es zu untersuchen. Wenn Sie es nur in Ihrem Unternehmensnetzwerk verwenden, ist SSH möglicherweise das einzige Protokoll, mit dem Sie sich befassen müssen. Wenn Sie anonymen schreibgeschützten Zugriff auf Ihre Projekte zulassen und auch SSH verwenden möchten, müssen Sie SSH einrichten, damit Sie es übertragen können, aber etwas anderes, von dem andere abrufen können.

Weitere Informationen finden Sie in der Referenz: Git auf dem Server - Die Protokolle

Amirhossein72
quelle
3

Sie müssen ein Verzeichnis auf einem Remote-Server erstellen. Verwenden Sie dann den Befehl "git init", um es als Repository festzulegen. Dies sollte für jedes neue Projekt erfolgen (jeden neuen Ordner).

Angenommen, Sie haben git bereits mit ssh-Schlüsseln eingerichtet und verwendet, habe ich ein kleines Python-Skript geschrieben, das bei Ausführung aus einem Arbeitsverzeichnis eine Fernbedienung einrichtet und das Verzeichnis als Git-Repo initialisiert. Natürlich müssen Sie das Skript (nur einmal) bearbeiten, um es dem Server und dem Root-Pfad für alle Repositorys mitzuteilen.

Überprüfen Sie hier - https://github.com/skbobade/ocgi

Sam
quelle
-3

Normalerweise können Sie ein Git-Repo einfach mit dem initBefehl einrichten

git init

In Ihrem Fall ist bereits ein Repo auf einer Fernbedienung verfügbar. Abhängig davon, wie Sie auf Ihr Remote-Repo zugreifen (mit Benutzername in der URL oder einem SSH-Schlüssel, der die Überprüfung übernimmt), verwenden Sie nur den folgenden cloneBefehl:

git clone git@[my.url.com]:[git-repo-name].git

Es gibt auch andere Möglichkeiten, das Repo zu klonen. Auf diese Weise rufen Sie es auf, wenn auf Ihrem Computer ein SSH-Schlüssel eingerichtet ist, der beim Abrufen Ihres Repositorys überprüft. Es gibt andere Kombinationen der URL, wenn Sie Ihr Kennwort und Ihren Benutzernamen einschließen möchten, um sich bei Ihrem Remote-Repository anzumelden.

Alex Cio
quelle
1
Wie ironisch ist das ... jemand hat diese Antwort heute gerade abgelehnt, und jetzt habe ich Probleme damit, meine Dateien zu pushen. Sieht so aus, als ob ich ein Git-Workout brauche, um mich wieder darauf einzulassen!
Alex Cio
7
Ich denke, das Problem ist, dass das OP eine Lösung zum Erstellen eines Remote-Repos auf einem SSH-Server wollte, aber Sie haben beschrieben, wie Sie ein lokales Repo von einem Remote-SSH-Server erstellen. Sie haben die Frage nicht beantwortet. (Nicht ich war der Down.)
Peter - Reinstate Monica