2016-06-21 12 views
2

Ich bin nur ein bisschen neugierig darauf, wie Source-Code-Hosting-Einrichtungen wie Bitbucket, GitHub und Launchpad tatsächlich den Forking-Prozess vom Haupt-Repository verwalten und wie sie ihren Server-Festplattenspeicher verwalten, wenn diese Repositories auf Server abgezweigt werden. Seite.Versionskontrolle: Wie funktioniert das Forking eines Repositories auf Quellcode-Hosting-Einrichtungen?

zum Beispiel, wenn ich aus einem Repository auf GitHub verzweigen: nimmt der kopierte Code auf meinem Repository einen zusätzlichen Speicherplatz (ich meine, es Speicherduplizierung verursacht) von der Master auf GitHub-Server?

Vielen Dank im Voraus.

Antwort

1

Basierend auf this answer es scheint, dass Github, zumindest nicht das Repository nicht kopieren, wenn es gegabelt. Stattdessen werden neue Zweige mit vorangestellten Benutzernamen erstellt (z. B. anstelle von master würde mein verzweigter Hauptzweig als lightcc.master referenziert).

Dies ist sehr sinnvoll im Zusammenhang damit, wie Git Dateien speichert und sie referenziert und warum es Repos so effizient speichern kann. Wenn ein Fork eine perfekte Kopie eines Repos ist, müssen Sie nur neue Zweige erstellen (Tracking-Verweise) und verfolgen, wer berechtigt ist, sie zu sehen und an sie zu ziehen/von ihnen zu ziehen. Wenn ich einen Repo ausgreife, aber niemals eine Änderung daran mache, könnten meine Tracking-Referenzen hinter dem Upstream-Repo stehen, aber sie werden immer dieselben sein wie diese alten Commits (es sei denn, das ursprüngliche Repo macht einige sehr schlechte Dinge [tm] und schreibt seine Geschichte durch Rebasing, Squashing usw. in bestehende Commits um).

Mit anderen Worten, zum Zeitpunkt eines ursprünglichen Forks muss keiner der ursprünglichen Repos kopiert werden, so dass die einzigen Kosten die Bytes sind, die benötigt werden, um die neuen Verfolgungsreferenzen zu erstellen, die ~ 40 Bytes pro vorhandenem Zweig sind. Und es kann sogar sein, dass es keine neuen Referenzen geben kann, bis Sie tatsächlich vom ursprünglichen Repo abweichen (oder bis Sie eine Tracking-Referenz eingerichtet und für eine bestimmte Verzweigung zu Ihrer Verzweigung hochgeschoben haben - also ist Master wahrscheinlich automatisch?).

Angesichts der Kommentare scheint es, dass dies ist, was Github tut, und daher Gitlab Akt tatsächlich replizieren die Repo (per 0xcaffs Antwort) ist eher eine Unix-Gabel, wo ein Duplikat-Prozess erstellt wird. Github möchte in einer sehr agilen Art und Weise bis zum letzten möglichen Moment warten, um irgendwelche neuen Objekte zu erzeugen, da eine Gabelung vom ursprünglichen Repo abweicht.

Dies ist wahrscheinlich der Grund, warum Github einige Regeln hat, um einen Fork vollständig von einem Original-Repo zu trennen, und warum Support benötigt wird. Dadurch werden sie Speicherplatz kosten und wenn sie dies alles leicht und kostenlos tun, können sie im Laufe der Zeit viel Speicherplatz verbrauchen.

1

Das ist eine gute Frage und hat mich das Gleiche fragen.

Gitlab

Glücklicherweise gibt es ein Open-Source-git Repo-Management-Tool namens Gitlab, die wir uns anschauen können.

In gitlab-shell funktioniert die fork_project Funktion Forking. Nach der Überprüfung, ob bestanden params gelten die folgende Zeile ausgeführt wird:

cmd = %W(git clone --bare -- #{full_path} #{full_destination_path}) 
system(*cmd) && self.class.create_hooks(full_destination_path) 

So Gitlab einfach klont das Repository, den Quellcode zu duplizieren.

Verwandte Fragen