2012-01-31 17 views
7

belirli bir nesneyi getir. benim yerel kopyada bazı şeyler çimdik çalıştı ettikten sonra (Ben bir paket dosyası ile hatalar vardı onu açmak çalıştı), bazı nesne dosyalarını silmiş olabilirsiniz. Örneğin :Git: biz çok büyük bir git deposunda (90Go) başa çıkmak zorunda İş yerinde uzak

> git gc

error: Could not read af9ed8[:snip:]

fatal: bad tree object af9ed8[:snip:]

error: failed to run repack

nasıl uzak deposundan (bu durumda karma af9ed8 olan ...) Belirli bir nesne getirebilir?

+1

Ben bu sorunuza cevap vermez biliyorum ama bölme yukarı o repo düşündüren düşünebilirsiniz! Şimdi o kadar büyükse, daha da büyüyecek, ve vay, bu klonlamanın uzun zaman alması gerekiyor. – Cascabel

+0

'Git getirme kaynağı'nı çalıştırırsanız ne olur? Çok fazla nesne almayı deniyor mu? – Cascabel

+0

@Jefromi Bu temelde klonlanamaz ^^ Prosedür sadece repo ham olarak kopyalayın. Ayrılmayı çok isterdim, ama bu tüm zaman boyunca ekibi felce uğratan bir işin cehennemi olurdu ve bu da sorumlu adamların yapacakları bir şey değil. Bundan ben sorumlu değilim (biraz yeni ...). Sadece bununla başa çıkmak için kullanılıyorlar: iç çekiş: ... –

cevap

4

bu nesneyi içeren uzaktan veya başka herhangi bir bozulmamış deposuna Dosya sistemi erişimi varsa, oraya gitmek ve çalıştırmak mümkün olmalıdır: Bu sadece erişimi salt okunur gerektirir o

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

Not repo (dosyayı başka bir yere yazabilirsiniz) çok güvenli olmalı ve dosya sistemine yazma izni olmayan bir kullanıcı olarak bile yapabilirsiniz. Daha sonra/senin repo uygun yere kopyalayın aktarabilirsiniz:

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

Gevşek nesneler karmasının ilk iki basamağı olan dizinlerde saklanır; dosya adları karma'nın geri kalanıdır.

Düzenleme: nesne ayrıca sadece doğrudan .git/objects dışarı kopya çeker uzak ucunda serbest, fakat o yemeği, sen git unpack-objects ile açmaktır olurdu, ve bunu repo packfiles hayal ederse yasak büyük. Bunu yapmanın en iyi yolu, paket dosyasını bozuk repo'unuza kopyalamak, bozuk nesneleri silmek ve git unpack-objects < packfile'u kullanmaktır, bu da zaten var olan nesneleri açmayacaktır.

Ben normal uzaktan komutlar aracılığıyla bunu nasıl emin değilim; Alt düzeydeki git fetch-pack hala bir ref seviyesinde çalışır ve ref'i tamamlamak için gerekli taahhütleri içeren bir paket alır. Ağaca referans veren tüm nesnelerin silinmesi gibi sinsi bir şey yapabildiğinizden şüpheleniyorum (git fsck onları bulmanıza yardımcı olabilir). Gerçekten, o nesnenin işaret eden bir etiket oluşturmak uzaktan kadar itin, ardından (nesneyi alma içine tatlı bir sesle) uzaktan etiketi getirmek için denemek mümkün olabilir umuyordum ama Git oldukça dikkatli gibi görünüyor değil varolmayan bir nesneyi gösteren bir etiket oluşturmanıza veya değiştirmenize izin verin.

+0

ile verdiği O bana söyleyen IMO daha güvenlidir. –

+0

Prune? Git gc mi demek istiyorsun? Belki de sadece git fsck ile başlamalıdır. Ve başka bir repodan gelen bir şeyi kopyaladıktan sonra nesnenin bozuk olduğunu mu söylüyor? (Ben de bu büyük bir repoda 'git gc'yi çalıştırmak istediğimden emin değilim, bu da bir loooooong zamanını alacak. – Cascabel

+0

İyi git gc bana aynı cevabı veriyor. Sanırım pes ediyorum ... –