2010-07-26 3 views
5

Wenn Sie git fetch verwenden, um Refs von einem (sehr großen) Repository zu einem anderen auf dem lokalen Computer zu holen, benötigt die Erstellung von Pack-Dateien sehr lange git upload-pack. Im lokalen Fall ist es nicht so notwendig, die Menge der transportierten Daten zu minimieren, und es ist mir egal, wie viel Speicherplatz durch den Verlust der Deltakompression verloren geht. Daher würde ich idealerweise lieber die fehlenden Objekte als die gepackten Objekte kopieren importiert. Gibt es eine Möglichkeit zu sagen git fetch, um nur die fehlenden Objekte zu kopieren, wenn Sie den lokalen Transport verwenden?Kann "git fetch" angewiesen werden, "git upload-pack" nicht für lokale Repositories zu verwenden?

Oder allgemeiner, gibt es eine Möglichkeit, die Generierung von Pack-Dateien global zu unterdrücken? Eigentlich möchte ich Git nur als versioniertes Dateisystem verwenden, das keinen zusätzlichen Platz für identische Dateien benötigt - das Packen und Umpacken scheint der zeitaufwendige Schritt zu sein, der das peinlich macht.

Übrigens, ich habe einige Zeit damit verbracht, die Konfigurationsoptionen zu optimieren, so dass das Repackieren nicht so lange dauert (noch zu beginnen), also glaube ich nicht, dass die Antwort "diese Konfigurationsoptionen verwenden und das Packen viel passieren wird schneller“- aber vielleicht muss ich das alles falsch, so dass nur klar zu sein, die Konfigurations-Optionen, die ich in der Regel mit bin (auf einer Bearbeitungs mit 2 GiB RAM) sind:

core.deltacachesize=1 
core.packedgitwindowsize=16m 
core.packedgitlimit=128m 
pack.packsizelimit=512m 
pack.windowmemory=200m 
pack.deltacachesize=200m 
pack.window=4 
pack.compression=3 
pack.threads=0 
gc.auto=0 
gc.pruneexpire=never 
receive.autogc=false 
+0

afaik, Git verwendet Hardlinks beim lokalen Klonen eines Repositorys. Ich weiß nicht über das Holen obwohl – knittl

Antwort

0

vielleicht (nicht getestet) Einrichten eines http-backend für Ihr erstes Repo (das, von dem Sie holen).

Diese Art von Server verfügt über eine Einstellung, die von Interesse in Ihrem Fall sein könnte:

http.uploadpack 

Dies dient git fetch-pack und git ls-remote Kunden.
Es ist standardmäßig aktiviert, aber ein Repository kann es deaktivieren, indem es dieses Konfigurationselement auf false setzt.

+0

Danke, VonC, aber setzt nicht HTTP.uploadpack = false Deaktiviere nur das Abrufen vom Smart HTTP-Transport vollständig? (Das ist es, was der Test in t556x_common ohnehin für mich nahe legt.) Das heißt, ich denke, die Aktionen des dummen HTTP-Transports könnten etwas sein, das ich nachahmen möchte, aber als eine Option für den lokalen Transport. Ich sollte zumindest versuchen, einen leichten HTTP-Server einzurichten, um zu sehen, ob die Verwendung des dummen Transports eine Geschwindigkeitsverbesserung wäre ... –

+0

@Mark: das könnte den intelligenten HTTP-Transport sehr gut deaktivieren. Aber selbst mit einem einfachen Nahverkehr ist das einen Versuch wert. – VonC

2

Vielleicht könnten Sie wechselt (alternative Objektspeicher) Mechanismus verwenden; dies würde ermöglichen, die Objektdatenbank mit anderen lokalen Repository zu teilen und sie dann nicht packen zu müssen.

Um mit diesem, verwenden Sie ‚git clone‘ entweder --shared Option einrichten, wenn von lokalen Repository klonen oder --reference <repository> wenn von Remote-Repository klonen, aber wenn man ähnliche Repository lokal hat, oder einfach nur .git/objects/info/alternates file bearbeiten.

+0

Jakub: Danke für die Antwort - Ich habe vorher schon Alternativen verwendet, aber im aktuellen Fall möchte ich die Objektdatenbanken zusammenführen, so dass ich ein eigenständiges Repository habe. Wie ich es verstehe, würde ein Depot mit Alternativen in ein eigenständiges Repository immer noch 'git repack' und somit die Längenpackung beinhalten. –

1

ich ein Repository haben, dass nur alte git clone nicht klonen:

$ git clone $url 
Cloning into foo... 
remote: Counting objects: 6142, done. 
error: pack-objects died of signal 9839/6058) 
error: git upload-pack: git-pack-objects died with error. 
fatal: git upload-pack: aborting due to possible repository corruption on the remote side. 
remote: aborting due to possible repository corruption on the remote side. 
fatal: early EOF 
fatal: index-pack failed 

Obwohl es durch den Fortschritt Text verborgen ist, die es zu überschreiben, die fehlerhafte Fehlermeldung error: pack-objects died of signal 9.

Ich konnte den Fehler durch Deaktivieren der Verpackung auf der Clientseite verhindern. Ich tat dies, indem ich eine Folge von Befehlen (ausgegeben mit git 1.7.4.1) ausgab, die im Grunde tun, was git clone tut, aber mit einem zusätzlichen Befehl, pack.depth auf 0 zu setzen, bevor git fetch ausgeführt wird.

mkdir foo 
cd foo 
git init 
git remote add origin $url 
git config pack.depth 0 
git fetch origin 
git branch --set-upstream origin origin/master 
git checkout master 
+0

Danke für den Vorschlag, vor allem angesichts der Tatsache, dass die Frage in S.O. Bedingungen :) Ich werde das bald ausprobieren. –