İlk önce aşağıdaki komutları deneyin (gerekirse tekrar çalıştırın):
$ git fsck --full
$ git gc
$ git gc --prune=today
$ git fetch --all
$ git pull --rebase
Ve sonra hala sorunlarınız varsa, şunları deneyin:
tüm bozuk nesneleri kaldırın, örn.
fatal: loose object 91c5...51e5 (stored in .git/objects/06/91c5...51e5) is corrupt
$ rm -v .git/objects/06/91c5...51e5
tüm boş nesneleri kaldırın, örn.
error: object file .git/objects/06/91c5...51e5 is empty
$ find .git/objects/ -size 0 -exec rm -vf "{}" \;
"bozuk bağlantı" mesajını şu şekilde kontrol edin:
git ls-tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
Bu size bozuk blobun hangi dosyadan geldiğini söyleyecektir!
Dosyayı kurtarmak için gerçekten şanslı olabilirsiniz ve çalışma ağacınızda halihazırda kontrol ettiğiniz sürüm olabilir:
git hash-object -w my-magic-file
tekrar ve eğer eksik SHA1 (4b945 ..) çıktısını verirse, işiniz bitti!
Bozuk olanın daha eski bir sürüm olduğunu varsayarsak, bunu yapmanın en kolay yolu yapmaktır:
git log --raw --all --full-history -- subdirectory/my-magic-file
ve bu size o dosyanın tüm günlüğünü gösterecektir (lütfen sahip olduğunuz ağacın en üst düzey ağaç olmayabileceğini fark edin, bu nedenle hangi alt dizinde kendi başınıza olduğunu bulmanız gerekir), sonra şimdi yeniden oluşturabilirsiniz hash-object ile eksik nesne tekrar.
eksik tamamlama, ağaç veya blob içeren tüm referansların bir listesini almak için:
$ git for-each-ref --format='%(refname)' | while read ref; do git rev-list --objects $ref >/dev/null || echo "in $ref"; done
Git bozulmayı fark ederse ölecekleri için, bu referanslardan bazılarını normal dallanma -d veya etiket -d komutlarını kullanarak kaldırmak mümkün olmayabilir. Onun yerine git update-ref -d $ ref sıhhi tesisat komutunu kullanın. Yerel dallar olması durumunda, bu komutun .git / config içinde eski dal yapılandırmasını geride bırakabileceğini unutmayın. Manuel olarak silinebilir ([branch "$ ref"] bölümüne bakın).
Tüm referanslar temizlendikten sonra, reflog'da hala bozuk kayıtlar olabilir. Git reflog expire --expire = now --all kullanarak tüm yeniden günlükleri temizleyebilirsiniz. Tüm yeniden bloglarınızı kaybetmek istemiyorsanız, kırık yeniden bloglar için bireysel referansları arayabilirsiniz:
$ (echo HEAD; git for-each-ref --format='%(refname)') | while read ref; do git rev-list -g --objects $ref >/dev/null || echo "in $ref"; done
(Git rev-list'e eklenen -g seçeneğini not edin.) Sonra, git reflog expire --expire = now $ ref kullanın. Tüm bozuk referanslar ve yeniden günlükler gittiğinde, deponun temiz olup olmadığını kontrol etmek için git fsck --full komutunu çalıştırın. Sarkan nesneler tamam.
Aşağıda, akıllıca kullanılmadığı takdirde potansiyel olarak git deponuzdaki verilerinizin kaybolmasına neden olabilecek gelişmiş komut kullanımını bulabilirsiniz, bu nedenle yanlışlıkla git'inize daha fazla zarar vermeden önce bir yedekleme yapın. Ne yaptığınızı biliyorsanız, kendi riskinizi deneyin.
Geçerli dalı getirdikten sonra yukarı akış dalının üstüne çekmek için:
$ git pull --rebase
Ayrıca yeni şubeyi kontrol etmeyi ve eskisini silmeyi deneyebilirsiniz:
$ git checkout -b new_master origin/master
Git'te bozuk nesneyi kaldırmak için bulmak için aşağıdaki komutu deneyin:
while [ true ]; do f=`git fsck --full 2>&1|awk '{print $3}'|sed -r 's/(^..)(.*)/objects\/\1\/\2/'`; if [ ! -f "$f" ]; then break; fi; echo delete $f; rm -f "$f"; done
OSX için sed -E
yerine kullanın sed -r
.
Diğer bir fikir, .git / objects içindeki tüm nesneleri yeniden oluşturmak için paket dosyalarındaki tüm nesneleri açmaktır, bu nedenle deponuzda aşağıdaki komutları çalıştırmayı deneyin:
$ cp -fr .git/objects/pack .git/objects/pack.bak
$ for i in .git/objects/pack.bak/*.pack; do git unpack-objects -r < $i; done
$ rm -frv .git/objects/pack.bak
Yukarıdakiler yardımcı olmazsa, git nesnelerini başka bir depodan yeniden senkronize etmeyi veya kopyalamayı deneyebilirsiniz, örn.
$ rsync -varu git_server:/path/to/git/.git local_git_repo/
$ rsync -varu /local/path/to/other-working/git/.git local_git_repo/
$ cp -frv ../other_repo/.git/objects .git/objects
Aşağıdaki gibi ödeme yapmaya çalışırken bozuk dalı düzeltmek için:
$ git checkout -f master
fatal: unable to read tree 5ace24d474a9535ddd5e6a6c6a1ef480aecf2625
Bunu kaldırmayı ve tekrar yukarı akıştan ödemeyi deneyin:
$ git branch -D master
$ git checkout -b master github/master
Git'in sizi müstakil duruma getirmesi durumunda, kontrol edin master
ve ayrılmış şubeyi onunla birleştirin.
Başka bir fikir, mevcut ana makineyi yinelemeli olarak yeniden oluşturmaktır:
$ git reset HEAD --hard
$ git rebase -s recursive -X theirs origin/master
Ayrıca bakınız:
.git
(tabii ki klasör hariç ) yeni kopyalanmış depoya kopyaladım ... ve sonragit status
yeni depoda yaptım ... git, dosyalarımdaki tüm etkilenen değişiklikleri doğru bir şekilde algılar ve işime yeniden başlayabilirim.