Verwenden von Git über mehrere Systeme ohne Netzwerkzugriff

9486
Tutu Kaeen

Ich möchte die Versionskontrolle verwenden, aber aus Sicherheitsgründen hat der Server, an dem ich arbeite, keinen Internetzugang: Ich kann nur Dateien auf einem USB-Flash-Laufwerk verschieben. Kann ich Git mit diesem Setup trotzdem verwenden? Kann ich kleine Patches erstellen, die ich in einem Git-Repository anwenden kann?

84
In Ihrem Titel wird kein Netzwerkzugriff angegeben, in Ihrer Frage wird kein Internetzugang angezeigt. ein großer Unterschied. tkausl vor 5 Jahren 65
Was ist der Unterschied im Kontext der Frage? Ich kann die Änderungen nicht nur von einem USB-Stick abrufen, da ich an dem Computer arbeite, der nicht mit dem Computer verbunden ist, auf dem ich implementiere. Jetzt mache ich es, indem ich nicht versionierte Dateien kopiere, genau wie die Entwickler vor mir. Ich möchte diesen Workflow ändern und das ist alles. Tutu Kaeen vor 5 Jahren 0
@TutuKaeen Sie können ein lokales Netzwerk haben, das nicht mit dem Internet verbunden ist. Anstelle von https://github.com richten Sie den git-Server beispielsweise an. https://192.168.1.100 und alles andere funktioniert gleich. Agent_L vor 5 Jahren 7
Warum sollte ich das tun? Die Maschine, an der ich arbeite, ist noch nicht mit der Maschine verbunden, die ich implementiere. Wenn ich im lokalen Netzwerk über zusätzliche Repos verfügt, muss ich von einem Flash-Laufwerk in ein lokales Netzwerk-Repository wechseln und in die Produktion ziehen. Wie ich es verstanden habe, kann ich das direkt von einem Flash-Laufwerk machen. Was ist der Vorteil, wenn Sie einen zusätzlichen Schritt hinzufügen? Tutu Kaeen vor 5 Jahren 1
@TutuKaeen: Die entscheidende Frage ist, ob eine direkte (oder indirekte) Netzwerkkommunikation zwischen den beiden Maschinen möglich ist. In Ihrem Fall sind also beide Maschinen vernetzt, aber die Netzwerke sind voneinander getrennt. In diesem Fall bearbeiten Sie diese Informationen bitte in Ihre Frage. sleske vor 5 Jahren 12
@TutuKaeen Deine Frage bleibt unklar. Sie sagen, Sie möchten die Versionskontrolle verwenden. In Ihren Kommentaren müssen Sie jedoch die Bereitstellung für die Produktion unterstützen. Diese Probleme überschneiden sich nicht immer. Ich denke, Sie haben jetzt unten gute Antworten, aber in Zukunft wäre es hilfreich, wenn Sie Ihre Frage ausführlicher über Ihre Anforderungen stellen würden: "Ich möchte die Versionskontrolle verwenden, mein Entwicklungscomputer hat keinen Internetzugang. Es hat zwar Netzwerkzugriff, aber nicht auf die Produktionsmaschine, und ich möchte wissen, wie Code aus der Versionskontrolle auf die Produktionsmaschine kommt. " DavidS vor 5 Jahren 15
Es ist einfach komisch, den Begriff "Server" für eine Maschine zu verwenden, die nicht an ein Netzwerk angeschlossen ist. Es kann auch nur ein lokales Netzwerk ohne Internetzugang sein, aber es ist trotzdem ein Netzwerk. uom-pgregorio vor 5 Jahren 4
"Git Bundle - All" ist ein guter Anfang Philip Oakley vor 5 Jahren 1
IIRC, das Verschieben von Patches über Wechselmedien offline über Wechselmedien war einer von Gits ursprünglich entwickelten Anwendungsfällen. T.E.D. vor 5 Jahren 0

5 Antworten auf die Frage

156
Bob

Sicher, es gibt nichts an Git, das ein bestimmtes Protokoll erfordert. Nur aus der Box unterstützt die Standard - Client - HTTP (S), SSH, das benutzerdefinierten Git - Protokoll und, besonders wichtig, das lokale Protokoll. Dies erfordert lediglich einen Pfad zu einem lokalen .gitVerzeichnis, das sich innerhalb des Arbeitsverzeichnisses ( /path/to/project/.git) oder nur eines bloßen Verzeichnisses ( /path/to/project.git) befinden kann, obwohl die Benennung nur eine Konvention ist.

Dies bedeutet, dass Sie ein Flash-Laufwerk natürlich als Fernbedienung hinzufügen können:

git remote add origin /mnt/flashdrive/foo.git 

oder unter Windows:

git remote add origin F:\foo.git 

Oder fügen Sie es sogar als zusätzliche Fernbedienung mit einem anderen Namen hinzu (wenn Sie es vorziehen origin, irgendwo auf einen Internetserver zu verweisen):

git remote add flashdrive /mnt/flashdrive/foo.git 

Dann können Sie einfach wie jede andere Fernbedienung diese Fernbedienung verwenden.

Wenn Sie die Dokumentation lesen, werden Sie feststellen, dass es auch ein file://Protokoll gibt, das sich etwas anders verhält. Es wird empfohlen, einen lokalen Pfad zu verwenden, da dies einige zusätzliche Optimierungen erfordert. Wenn Sie das file://Protokoll verwenden, verwendet git einige Standard-Netzwerkkomponenten (um mit der lokalen Festplatte zu kommunizieren), was langsamer ist.

Um diese außergewöhnliche Antwort zu ergänzen - Es kann sich auch lohnen, ein "nacktes" Reservoir auf dem Flash-Laufwerk zu untersuchen. 'nackte' Repositorys haben keinen funktionierenden Baum, so dass eine Kategorie potenzieller Probleme ausgeschlossen wird, wenn sie als gemeinsamer 'Autorisierungspunkt' verwendet werden, was wie der Anwendungsfall des OP klingt. Iron Gremlin vor 5 Jahren 49
Das `file: //` ist auch etwas flexibler. Sie können einige Funktionen (wie flache Klone) verwenden, die Sie nicht mit einem lokalen Pfad verwenden können. Austin Hemmelgarn vor 5 Jahren 5
@IronGremlin Könnten Sie diesen Begriff "Shared Point of Authority" erweitern? Ich bin kein Git-Experte und bin gespannt, was Sie damit meinen. Lightness Races in Orbit vor 5 Jahren 1
@LightnessRacesinOrbit - Dies ist ein ziemlich dichtes Thema, aber im Grunde ist git verteilt, sodass jeder seine eigene Geschichte bekommt. A kann B nach seiner Version des Verlaufs fragen, aber C weiß nichts davon, es sei denn, jemand sagt es ihnen. Ein einziges Repository für die Speicherung der "autoritativen" Historie bedeutet, dass D als Clearing House für Historien fungiert. Also erzählt A von D über Änderungen und B und C wissen, dass sie mit D reden müssen, um auf dem neuesten Stand zu bleiben, anstatt Side-Channel-Sachen unter sich zu machen. Wenn der Server von OP C ist und das Flashlaufwerk D ist, wird sichergestellt, dass der Server nicht von A / B-Interaktionen ausgeschlossen wird. Iron Gremlin vor 5 Jahren 2
@IronGremlin Okay, interessant, und ich glaube, ich verstehe. IMO die Terminologie warf mich ein bisschen ab - obwohl ich jetzt verstehe, warum sie "nackt" (kein Arbeitsbaum) genannt werden, scheint der Kernanwendungsfall eine andere Klasse von Repo zu sein, eine Art "Gott" oder "Wurzel". Repo, zu dem die Klone aufschauen sollten. Ich weiß nicht, was ich sonst noch als Repo bezeichnen würde, aber ich bin mir nicht sicher, ob "nackter" am klarsten ist. Dann beschreibt es wiederum, was es ist und nicht, wie die Leute es benutzen, also ist es vielleicht alles, was wir brauchen :) Trotzdem, danke für die Erklärung! Lightness Races in Orbit vor 5 Jahren 0
@LightnessRacesinOrbit Hier ist zu beachten, dass Bare nicht autoritär sein muss, sondern nur in diesem Zusammenhang nützlich ist. Zum Beispiel ist es auch nützlich, da es keinen Arbeitsbaum gibt und der Speicherbedarf (oder Bandbreite) geringer ist. Dies war früher viel wichtiger als jetzt, kommt aber trotzdem. Iron Gremlin vor 5 Jahren 6
@Iron: Hab dich. Lightness Races in Orbit vor 5 Jahren 0
@AustinHemmelgarn Wahrscheinlich, weil es keinen Sinn gibt, flache Klone auf lokalen Pfaden zu verwenden. Git optimiert es durch die Verwendung von harten Links anstelle von Dateikopien. Ein Full-Deep-Klon belegt keinen zusätzlichen Speicherplatz. Zan Lynx vor 5 Jahren 0
@ZanLynx Hard-Links gelten nur für lokale Pfade im selben Dateisystem, was hier definitiv nicht der Fall ist. Im Allgemeinen ist es jedoch sehr wählerisch, Hardlinks zu erhalten, wenn Dateien aktiv erstellt oder gelöscht werden, z. B. mit gits Packing. (Daher besteht die Notwendigkeit für [git-relink] (https://git-scm.com/docs/git-relink), um diese Einschränkung zu überwinden.) jpaugh vor 5 Jahren 0
@ZanLynx Hard-Links funktionieren nicht immer wie erwartet, und Sie können sie offensichtlich nicht verwenden, wenn Sie auf ein anderes Dateisystem klonen. Darüber hinaus ist es ein schönes Sicherheitsnetz, wenn Sie sicherstellen möchten, dass Sie nicht versehentlich Push ausführen können, während Sie trotzdem Updates abrufen können (obwohl es im Idealfall bessere Möglichkeiten gibt, dies zu tun). Austin Hemmelgarn vor 5 Jahren 0
46
grawity

Auf einem einzelnen Computer ist nichts Besonderes erforderlich. Führen git initSie das gewünschte Verzeichnis aus und arbeiten Sie wie gewohnt mit Git.

Für die Synchronisierung eines Repositorys auf mehreren Computern gibt es verschiedene Methoden.

Methode 1a (überhaupt kein Netzwerk): Sie können auf dem USB-Stick ein 'nacktes Repository' erstellen, dann auf das USB-Stick drücken und von dort entfernen, wie Sie es auch mit einem anderen Remote-Repository tun würden. Mit anderen Worten, Repository-Vorgänge über lokale Pfade unterscheiden sich nicht von Vorgängen über SSH- oder HTTPS-URLs.

  1. Erstellen Sie ein "entferntes" Repository:

    $ git init --bare /mnt/Stick/Repositories/Large_Project.git 
  2. Drücken Sie in Computer 1 alles darauf:

    $ cd ~/Large_Project $ git remote add usb /mnt/Stick/Repositories/Large_Project.git $ git push usb master 
  3. In Computer 2, genau wie immer.

    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git $ git pull usb 

(Sie können auch direkt von einer URL oder einem Pfad aus Push / Fetch / Pull ausführen.)

Methode 1b (internes Netzwerk): Wenn Sie über einen internen Server mit SSH verfügen und Git installiert ist, können Sie dasselbe wie oben tun. Geben Sie einfach eine SSH-Adresse mit der Syntax [user@]host:pathoder an ssh://[user@]host/path.

  1. Erstellen Sie ein 'Remote'-Repository, indem Sie git init --bare <somepath.git>auf dem angegebenen Server (über SSH) laufen .

  2. In Computer 1 auf dieselbe Weise wie zuvor gezeigt.

    $ git remote add origin myserver.example.com:Gits/Large_Project.git 

    Oder wenn Sie es vorziehen:

    $ git remote add origin ssh://myserver.example.com/Gits/Large_Project.git 
  3. In Computer 2 das gleiche wie bei Verfahren 1a.


Methode 2: Sie können "Übertragungspakete" erstellen, die eine bestimmte Liste von Commits in einer einzigen Datei archivieren.

Leider können sich die Bundle-Befehle nicht automatisch an das erinnern, was beim letzten Mal bereits gebündelt wurde. Daher ist ein manuelles Markieren oder Notizen erforderlich. Ich nehme nur die Beispiele aus dem Git-Bundle-Handbuch.

  1. Erstellen Sie in Computer 1 ein Bündel des gesamten Zweigs:

    $ cd ~/Large_Project $ git bundle create /mnt/Stick/Project.bundle master $ git tag -f last-bundled master 
  2. Ziehen Sie in Computer 2 das Paket ab, als wäre es ein Repository:

    $ cd ~/Large_Project $ git pull /mnt/Stick/Project.bundle 

Nachfolgende Pakete müssen nicht das Ganze packen master- sie können last-bundled..masterstattdessen nur die neu hinzugefügten Commits packen .

  1. Erstellen Sie in Computer 1 ein Bündel der neu hinzugefügten Commits:

    $ cd ~/Large_Project $ git bundle create /mnt/Stick/Project.bundle last-bundled..master $ git tag -f last-bundled master 
  2. Das gleiche wie oben.

Eigentlich wäre es nicht schlecht für meine Zwecke, auch in git ist nichts "primär", da jedes Repository die gesamte Historie hat, so dass Sie es jedes Mal neu erstellen können, wenn etwas schief geht Tutu Kaeen vor 5 Jahren 0
"Manuelles Tagging oder Notiz-Halten" ist erforderlich. Eine Option, sofern das Repo nicht sehr groß ist: "Git-Bundle create my.bundle --all", es sollte alles enthalten birdspider vor 5 Jahren 0
Ich mag diese Antwort mehr, da sie eher illustrativ ist, auch wenn die akzeptierte Antwort das gleiche sagt. Rystraum vor 5 Jahren 0
Was ist die Bedeutung der "bloßen" Option? Lightness Races in Orbit vor 5 Jahren 0
Es erstellt ein Repository, das _just_ der Datenbank ist (was Sie normalerweise im versteckten Ordner `.git /` finden würden), ohne einen 'Arbeitsbaum' (die bearbeitbaren Dateien). Es ist das bevorzugte Formular für Repositories, zu denen Sie "git push" gehen. grawity vor 5 Jahren 1
21
Vi.

git bundle create

Eine der Methoden ist die Verwendung eines externen Speichers, um Daten zwischen Repositorys auszutauschen, zB git bundle . Auf diese Weise haben Sie für jede Übertragung nur einzelne Dateien, keine Git-Zwischenablagen.

Jeder "git push" wird zur Erstellung einer Datei, "git fetch" holt Dinge aus dieser Datei.

Demo-Sitzung

Das erste Repository erstellen und den ersten "Push" durchführen

gitbundletest$ mkdir repo1  gitbundletest$ cd repo1  repo1$ git init Initialized empty Git repository in /tmp/gitbundletest/repo1/.git/ repo1$ echo 1 > 1 && git add 1 && git commit -m 1 [master (root-commit) c8b9ff9] 1 1 file changed, 1 insertion(+) create mode 100644 1  repo1$ git bundle create /tmp/1.bundle master HEAD Enumerating objects: 3, done. Counting objects: 100% (3/3), done. Writing objects: 100% (3/3), 384 bytes | 384.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) 

"Klonen" in das zweite Repository (dh den zweiten Computer):

gitbundletest$ git clone /tmp/1.bundle repo2 Cloning into 'repo2'... Receiving objects: 100% (3/3), done.  gitbundletest$ cd repo2/  repo2$ cat 1 1 

Änderungen vornehmen und in eine andere Bundle-Datei "pushen":

repo2$ echo 2 > 1 && git add 1 && git commit -m 2 [master 250d387] 2 1 file changed, 1 insertion(+), 1 deletion(-)  repo2$ git bundle create /tmp/2.bundle origin/master..master origin/HEAD..HEAD Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Writing objects: 100% (3/3), 415 bytes | 415.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) 

"Ziehen" von Änderungen zum ersten Repository:

repo2$ cd ../repo1  repo1$ git pull /tmp/2.bundle  Receiving objects: 100% (3/3), done. From /tmp/2.bundle * branch HEAD -> FETCH_HEAD Updating c8b9ff9..250d387 Fast-forward 1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)  repo1$ cat 1 2 

Im Gegensatz zum ersten Bundle enthält das zweite nur einen partiellen Git-Verlauf und ist nicht direkt klonbar:

repo1$ cd ..  gitbundletest$ git clone /tmp/2.bundle repo3 Cloning into 'repo3'... error: Repository lacks these prerequisite commits: error: c8b9ff94942039469fa1937f6d38d85e0e39893a  fatal: bad object 250d38747656401e15eca289a27024c61e63ed68 fatal: remote did not send all necessary objects 

Die Verwendung von Paketen hat den Nachteil, dass Sie manuell angeben müssen, welchen Commit-Bereich jedes Bündel enthalten soll. Im Gegensatz zu git push, git bundlezu verfolgen, was in früherem Bündel war nicht, müssen Sie manuell einstellen refs/remotes/origin/masteroder Bündel würde größer sein, als es sein könnte.

Vergessen Sie nicht, die "--all" Flagge zu erwähnen, um alles zu bekommen. Wenn das Repo klein genug ist, ist dies der einfachste Vorgang, da Sie einfach jedes Mal alles übertragen! Verliere nicht den Speicherstick - wahrscheinlich die größte Sicherheitslücke! Philip Oakley vor 5 Jahren 0
7
kenorb

Sie müssen Git zuerst installieren . Führen Sie anschließend den Ordner aus, den Sie kopiert haben, um ein neues Repository zu erstellen:

git init 

Dann können Sie Dateien hinzufügen, die Sie zur Versionskontrolle hinzufügen möchten, indem Sie git add( -afür alle Dateien hinzufügen ) und beginnen, die Änderungen zu übernehmen ( git commit).

Sie müssen keine Remote-Verbindung herstellen, da Sie an Ihrem lokalen Verlauf arbeiten können ( git log).

Weitere Informationen finden Sie unter:


Schieben / Ziehen ohne Internet

Mit dem git pushBefehl ist es möglich, SSH zu übertragen (über eine lokale Verbindung, ein Intranet):

git remote add server ssh://[user@]host.xz[:port]/path/to/dev/repo.git/ git push server 

oder in den Ordner schieben:

git push /mnt/usb/my_repo 

Dies setzt voraus, dass Sie zwei Kopien Ihres Repository haben.

Das gleiche beim Ziehen, z

git pull /mnt/usb/my_repo 

Patchen

Um Patches anzuwenden, können Sie den patchBefehl oder verwenden git apply.

Siehe: Patch- oder Diff-Datei aus git-Repository erstellen und auf ein anderes anderes git-Repository anwenden .

5
dhae

Sie können Git auch lokal verwenden. Dann werden Ihre Commits nur lokal gespeichert, und Sie verfügen immer noch über eine Versionskontrolle (und können sie unterscheiden / zusammenführen usw.), aber Sie können von keinem anderen Computer aus auf das Repository zugreifen.

Sie können ein lokales Git-Repository starten, indem Sie es git initin Ihrem lokalen Ordner ausführen. Wie hier beschrieben .

Ich weiß, aber ich möchte auf einem anderen Computer arbeiten und es auf Dateien auf einem Server ohne Internetzugang anwenden Tutu Kaeen vor 5 Jahren 3
@TutuKaeen Ich sehe nichts Falsches daran, das Repository auf einem Flash-Laufwerk zu haben und es einfach auf Festplatten verschiedener Computer zu klonen / zu synchronisieren. "Server ohne Internetzugang" klingt jedoch merkwürdig, das Ziel eines Servers besteht darin, einen Dienst bereitzustellen. Meistens bezieht sich der Dienst auf das Netzwerk (aber nicht immer). AnonymousLurker vor 5 Jahren 2
@dhae - Bitte nehmen Sie sich einen Moment Zeit, um weitere Informationen zur lokalen Verwendung von Git zu geben. Nur darauf hinzuweisen, dass dies möglich ist, ist eine Antwort nicht so hilfreich. Ramhound vor 5 Jahren 2
@Ramhound Ist das besser so? Und sollte ich meine Antwort löschen, da es Antworten gibt, die viel mehr hinzufügen und besser beschreiben? Oder ist das in StackExchange nicht zu tun? dhae vor 5 Jahren 0
Antwort Autoren sollten jede Gelegenheit erhalten, ihre Antwort zu verbessern, bevor sie gelöscht wird. Ramhound vor 5 Jahren 0
@anonymousLurker der Server liefert Daten an ein geschlossenes Netzwerk in einer sehr wichtigen Einrichtung. Es dient einfach nicht dem breiten Internet, da die Daten nur für die Mitarbeiter sehr empfindlich sind. Tutu Kaeen vor 5 Jahren 2
@TutuKaeen: Wenn er über einen Netzwerkzugang verfügt, können Sie Ihren eigenen Git-Server immer über SSH betreiben. Git ist mehr als nur GitHub. grawity vor 5 Jahren 1