2012-01-31 20 views
7

W pracy musimy poradzić sobie z bardzo dużym repozytorium git (90Go). Po tym, jak próbowałem poprawić niektóre rzeczy na mojej lokalnej kopii (miałem błędy w pliku spakowanym, próbowałem rozpakować), mogłem usunąć niektóre pliki obiektów. Na przykład:Git: pobranie określonego obiektu ze zdalnego

> git gc

error: Could not read af9ed8[:snip:]

fatal: bad tree object af9ed8[:snip:]

error: failed to run repack

Jak mogę pobrać konkretny obiekt (w tym przypadku jeden z af9ed8 hash ...) z zdalnego repozytorium?

+1

Wiem, że to nie odpowiada na twoje pytanie, ale możesz rozważyć sugerowanie podziału tego repo! Jeśli jest teraz tak duży, to tylko się powiększy, a wow, klonowanie musi zająć dużo czasu. – Cascabel

+0

Co stanie się, jeśli uruchomisz 'git fetch origin'? Czy próbuje pobrać zbyt wiele obiektów? – Cascabel

+0

@Jefromi Zasadniczo niezaskakujące ^^. Procedura jest po prostu dokładnie kopiowana na repozytorium. Chciałbym to rozdzielić, ale to byłaby piekielna praca, przez cały czas paraliżująca drużynę i to nie to, co zamierzają faceci. Nie jestem za to odpowiedzialny (jestem trochę nowy ...). Są po prostu używane do radzenia sobie z tym: westchnienie: ... –

Odpowiedz

4

Jeśli masz system plików dostęp do zdalnego lub jakiejkolwiek innej nienaruszonym repozytorium zawierającego ten obiekt, powinieneś być w stanie iść tam i uruchom:

git cat-file tree af9ed8 > 9ed8... 

pamiętać, że tylko ten wymaga tylko do odczytu dostępu do repo (możesz napisać plik gdzie indziej), więc powinno być bardzo bezpieczne, możesz nawet zrobić to jako użytkownik, który nie ma uprawnień do zapisu w systemie plików. Następnie można przenieść/skopiować go do odpowiedniego miejsca w swoim repo:

cp path/to/9ed8... .git/objects/af/9ed8... 

Luźne przedmioty są przechowywane w katalogach z dwóch pierwszych cyfr mieszania; nazwy plików są resztą hasza.

Edycja: Jeśli obiekt jest luźny na zdalnym końcu, możesz również bezpośrednio skopiować go z .git/objects, ale jeśli jest zapakowany, musisz rozpakować go za pomocą git unpack-objects i wyobrażam sobie, że pliki pakietu w tym repo są zaporowo duży. Najmilszym sposobem na to byłoby skopiowanie pakietu do uszkodzonego repozytorium, usunięcie uszkodzonych obiektów, a następnie użycie git unpack-objects < packfile, które nie rozpakuje żadnych obiektów, które już istnieją.

Nie jestem pewien, jak to zrobić za pomocą zwykłych poleceń zdalnych; nawet niższy poziom git fetch-pack nadal działa na poziomie odniesienia, pobierając pakiet z niezbędnymi zatwierdzeniami do uzupełnienia ref. Podejrzewam, że możesz zrobić coś podstępnego, jak usunięcie wszystkich obiektów commit, które odwołują się do tego drzewa (git fsck może ci pomóc je znaleźć). Naprawdę miałem nadzieję, że uda ci się stworzyć tag wskazujący na ten obiekt, przesłać go do pilota, a następnie spróbować pobrać tag z pilota (namawiając go do pobrania obiektu), ale wygląda na to, że Git jest bardzo ostrożny, Pozwól, abyś zrobił lub manipulował znacznikiem wskazującym na nieistniejący obiekt.

+0

Mówi mi, kiedy próbuję przycinać ponownie, że obiekt af9ed8 ... mojego lokalnego repo jest uszkodzony. –

+0

Prune? Masz na myśli 'git gc'? Może powinieneś zaczynać od 'git fsck'. I mówi, że obiekt jest uszkodzony po skopiowaniu nienaruszonego z innego repozytorium? (Nie jestem pewien, czy chciałbym uruchomić 'git gc' na repo tak dużym, to zajmie trochę czasu.) – Cascabel

+0

Well git gc daje mi tę samą odpowiedź. Myślę, że poddaję się ... –

Powiązane problemy