Bilgisayar öldükten sonra Git deposu bozuldu


96

Bilgisayarım kapandı ve şimdi git depolarımdan biri bozuldu. Master'ı kontrol etmeye çalıştığımda bana şunu söylüyor:

warning: ignoring broken ref refs/heads/master.
error: Your local changes to the following files would be overwritten by checkout:
        com.vainolo.jdraw2d.releng.p2/pom.xml
Please, commit your changes or stash them before you can switch branches.
Aborting

Çalıştırdığımda git stashşunu elde ederim:

fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet

Peki ne yapabilirim?

Çıkışını Güncellegit reflog :

fatal: bad default revision 'HEAD'

Pek umut verici değil ... Çıktı git fsck:

error: Invalid HEAD
Checking object directories: 100% (256/256), done.
error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt

Var olup .git/refs/heads/masterolmadığını ve içeriğinin deponuzun geçerli bir commit karması olup olmadığını kontrol edebilir misiniz (bunu kullanarak kontrol edebilirsiniz git show <hash>)?
dürtmek

Bunun açık olduğunu biliyorum, ama yine de soruyorum - aynı git deposunun herhangi bir uzak deposu var mı?
Tuxdude

@poke içeriği .git/refs/heads/master/bir demet^@
vainolo

@Tuxdude evet, ancak son değişikliklerime güncellenmedi
vainolo 09

1
Sana ne git refloganlatıyor Koşmayı denedin git fsckmi?
kynan

Yanıtlar:


175

Şunlardan kurtulmayı başardım:

rm .git/refs/remotes/origin/HEAD
git fetch --all

Benim durumumda, bazı yerel ve uzak dalları sildiğim için oldu (bir şekilde .git / refs / remotes / origin / HEAD dosyası tutarsız bir durumda kaldı). Yukarıda bahsedilen dosyanın içeriğinin mevcut bir yerel şubeye işaret edecek şekilde değiştirilmesi (örn. Ref: refs / remotes / origin / master) bu sorunu çözdü. Yine de, yukarıdaki yaklaşım daha iyi olabilir çünkü HEAD, mevcut dalda olmayan bir işleme işaret edebilir.
crissdev

Sorunun belirli bir git alt rm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
modülünde

1
Yapmam gerekiyordu rm -rf .git/refs/remotes/origin, ama beni doğru yönü gösterdin
Jacka

24

Bozuk git deposunu kurtarma bölümünde önerilen adımları izleyerek başlayın :

  • .git/refshala yararlı bir şey içerip içermediğini kontrol edin
  • git reflogen .git/logs/refs/heads/masterson hangi şubede olduğunuzu kontrol edin ve başarısız olun
  • git fsckpotansiyel olarak --unreachableveya ile koş--lost-found

Bu umarım ref'in ne masterolması gerektiğini bulmanızı sağlar, böylece onu geri yükleyebilirsiniz (yani doğru SHA1'i içine katlayabilirsiniz .git/refs/heads/master).

Bu kayıtta bulunan herhangi bir nesnenin gerçekten bozuk olması durumunda, HEADmaalesef yürütmenizi geri yükleyemezsiniz . Çalışma ağacınızın ve / veya dizininizin sağlam olduğunu varsayarsak, git reset --softbir git resetönceki işleme için bir deneyebilirsiniz (veya başarısız olarak a ) ve ardından kaydetmeyi yeniden yapabilirsiniz. Çalışma ağacınızı değiştiren herhangi bir işlemden kaçının sa git checkout -fveya git reset --hard.


Baktım .git/logs/refs/heads/mybranch. Bu şubeye bağlılıkların bir tür tarihini gösteriyor. Bunu derinlemesine inceleyerek SHA'ları seçtim ve onları ile göstermeye çalıştım git show. (Her kayıtta iki SHA var, ikincisini yazarın adından hemen önce seçtim.) Sonuncusu bozuktu ama ondan öncekiyse git shown olabilirdi ve sonra onu itebildim git push origin abcdef:mybranch.
Ed Avis

13

Windows 8.1'de mavi bir ölüm ekranının ardından benzer bir sorun yaşadım

Bu konumda bir dosyam vardı ...

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

Ve bu klasördeki diğer dal dosyalarının içinde uzun dizeler varken boştu.

NB Herhangi bir değişiklik / işlemim olmadı

  • <problem-branch>Dosyayı yedekledim
  • Dosyayı sildi
  • git fetch --all şubeyi tekrar almak için

Ardından sekmeyi otomatik tamamlama tekrar çalışmaya başladı


6

Çok fazla değiştirilmiş dosya yoksa, bu sorunu çözmenin en uygun yolu şudur:

  1. depoda değiştirdiğiniz dosyaları yedekleyin
  2. mevcut deponuzu kaldırın
  3. sunucudan yeniden klonlayın
  4. 1. adımdaki dosyaları depoya yapıştırın ve git commit -a

evet, kimse yeniden klonlamayı düşünemezdi. harika öneri
Selman Genç

5

git \ refs \ heads dizinindeki ana dosyayı silerek çözmeyi başardım


Bu yardımcı oldu, şubeyi intellij'deki listemden çıkardı ve yeni bir şube olarak kontrol ettim. Neyse ki değişikliklerimi zorladım, böylece hepsi oradaydı.
OAM

4

Bir bilgisayarlı dondurulması ve çökme sonra benim git şube mesajla hasar gördü: git fatal: your current branch appears to be broken. Hiçbir şey yapamadım.

Yaptıktan sonra git fsckşubenin bir error: Invalid HEAD. refs/heads/<branch>bir invalid sha1 pointer.

Buradaki seçenekleri izledikten sonra, .git/refs/heads/<branch>bir notepad ++ düzenleyicide açtım ve sha1 karakterlerinin her biri NUL.

Neyse ki sadece şubeyi uzak duruma sıfırlamam gerekiyordu ve bu bir bitbucket deposundaydı. SHA1'i uzak deponun ucundan aldım ve .git/refs/heads/<branch>kaydedilene kopyaladım , sonra bir yaptım git reset --hard HEADve her şey normale döndü.


2

İtmeyi unutacak kadar aptaldım ve bir taahhütte bulunurken bilgisayarım çöktü. .Git / logs / refs / heads / açarak son commit dışındaki her şeyi kurtarabilirim.

Bu dosya şubeye yapılan tüm taahhütleri (SHA'ları ile birlikte) içerir, kurtarmak için yaptığım şey şuydu:

  • En son değişiklikleri geçici bir klasöre yedekleyin
  • "temiz bir sayfaya geç"
    • git checkout master
    • git reset --hard
  • günlükteki son işlemeden ikinciyi kontrol et
  • bu kopuk kafadan bir dal yarat
  • İT
  • En son değişiklikleri geri yükleyin
  • Tekrar taahhüt et

Yani aptalca bir hata yaptığınızda bile, git ile tüm gün çalışarak hemen geri alınmazsınız :)


2

Ref kilitlenemiyor hatası nedeniyle ana şubemi ödünç alamadım. Silmeyi sonlandırdım: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

ve bu git komutunu çağırmak:

git fetch --all

1

Bunun çok geç bir yanıt olduğunu biliyorum, ancak bu hatayı alıyordum çünkü bir origin/head. Bunu koşarak öğrenebilirsiniz git branch -r. origin/headUzak bir başlangıç ​​noktasına işaret ettiğinizi görmezseniz , bunu koşarak ayarlayabilirsiniz git remote set-head origin {{your branch name}}.

Şimdi git branch -rtekrar koşun ve şuna benzer bir şey görmelisiniz: origin/HEAD -> origin/develop

Umarım bu, bu sorunla karşılaşan herkese yardımcı olur.


1

Bilgisayarım iki kez çöktü ve sonuç olarak git depom yerel olarak bozuldu. Değişikliklerimi çekemedim, uzak orijini ayarlamak istedi ama gitKraken'de çalışmadı.

Komut istemimde bu hatayı alıyordum görüntü açıklamasını buraya girin

Referanslarımın bozuk olduğunu ve düzeltilmesi gerektiğini biliyordum. Yapmam gereken şey git bash (SourceTree'de "terminal" e tıklayın). Ardından bunun gibi referanslar klasörüne gidin

cd .git
cd refs
cd remotes
cd origin

orada bir dosya adı olacak , dizinde ne olduğunu görmek için masterkullanın ls. Ardından rm master'ı kullanarak silin

bam, bozuk dosya gitti. Şimdi git branch komutunu -a verirseniz, bunu çıktılar

$ git branch -a
* master
  remotes/origin/master (this in red color -scary :) )

Sonra bu komutu verin ve referanslarınızı düzeltir

$ git remote set-head origin master

Özetlemek gerekirse, uzaktan kumandayı çekmeye çalışırsanız, düzeltilmiş olan boş bir uzak adı göstermelidir.

görüntü açıklamasını buraya girin


0

Aynı sorunu yaşadım ama şansım olmadı, sorunu çözemedim. Depomu bir tarafa aldım, sunucudan olanı yeniden klonladım ve aralarında birleşmeye çalıştım. Elbette şubemle ilgili olmayan birçok dosya gösterdi, ancak gerekli dosyaları izole etmeye yardımcı oldu.


0

MSWindows'un git'i barındıran desktop.ini dosyalarını oluşturup oluşturmadığını kontrol edin. benim için yapar. .Git dizininin alt klasörlerindeki hepsini sildiğimde işe yarıyor.


0

Android Studio aniden sonlandırıldığında da aynı sorunu yaşadım (bilgisayarın gücünün kesilmesi nedeniyle).

Benim içeriğini kopyalayarak münhal C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\masterbenim için dosyanın C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\masterdosyası.

(Önceden, Android Studio'da 'Zorla İtme' seçeneğini de açmıştım, ancak bunun gerekli bir adım olduğunu düşünmüyorum.)

Not:

Bu çözümü, dizinimdeki C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\(alt dizinler dahil) dosyaların içeriğini başka bir sağlıklı projedeki ilgili dosyalar ile karşılaştırarak buldum - örn C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\.

Bozuk farklı bir dosyanız olabilir, ancak başka bir sağlıklı projeyle karşılaştırarak neyin yanlış olduğunu hızlı bir şekilde tespit edebilmelisiniz.

Git yapılandırılmış başka bir sağlıklı projeniz yoksa, tıpkı bozuk projenizi oluşturduğunuz gibi basit bir proje oluşturmaya değer olabilir, böylece araştırma, karşılaştırma ve düzeltme vb.

Not - Hata mesajım (düzenlendi): warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --


0

Birinden sonra tekrar edersem beni affet (tüm geri bildirimleri okumadım). Bence sorunu çözmenin en basit yolu projeyi .git ve .idea olmadan kopyalamak, temizlemek, git'ten klonlamak, yukarıdaki dizinler dışındaki her şeyi silmek ve ardından önceki kopyayı .git ve .idea ile yeni oluşturulan depoya yapıştırmaktır. . Umarım mantıklıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.