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.
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
Co stanie się, jeśli uruchomisz 'git fetch origin'? Czy próbuje pobrać zbyt wiele obiektów? – Cascabel
@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: ... –