Antworten:
Ich denke, Sie erstellen ein nacktes Repository auf der Remote-Seite, git init --bare
fü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 pull
aus dem Remote-Repository.
git push origin master
Fehler "Repository nicht gefunden" fehlschlägt, versuchen Sie es git update-server-info
auf der Remote-Seite, wo Sie es getan habengit init --bare
git update-server-info
aber ich bekomme den Fehler fatal: Unable to look up Volumes (port 9418) (nodename nor servname provided, or not known)
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 --bare
Option aus. Konventionell enden nackte Repository-Verzeichnisse .git
wie 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/git
Verzeichnis speichern . Sie können Ihr neues Repository einrichten, indem Sie Ihr nacktes Repository über Folgendes kopieren:
$ scp -r my_project.git user@git.example.com:/opt/git
Zu diesem Zeitpunkt können andere Benutzer, die SSH-Zugriff auf denselben Server haben, der Lesezugriff auf das /opt/git
Verzeichnis hat, Ihr Repository durch Ausführen klonen
$ git clone user@git.example.com:/opt/git/my_project.git
Wenn ein Benutzer SSHs auf einem Server hat und Schreibzugriff auf das /opt/git/my_project.git
Verzeichnis hat, hat er automatisch Push-Zugriff. Git fügt einem Repository automatisch ordnungsgemäß Gruppenschreibberechtigungen hinzu, wenn Sie den Befehl git init mit der --shared
Option ausführen .
$ ssh user@git.example.com
$ 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.
scp
Lö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.
--shared
für mich gearbeitet hat. Ich frage mich, was passiert, wenn Sie verwenden, git init --shared
ohne eine --bare
zu machen ...
scp
das 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.
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).
Es gibt einen interessanten Unterschied zwischen den beiden oben genannten gängigen Lösungen:
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.
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.
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
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
Normalerweise können Sie ein Git-Repo einfach mit dem init
Befehl 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 clone
Befehl:
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.