Müdürün ofisinde, köpeğin doğduğu gün ev ödevimi yediğini açıklayan bir çocuk gibi hissediyorum, ama karşısında çılgınca bir veri kaybı hatası görüyorum ve bunun nasıl olduğunu çözemiyorum. Git'in depo bütünümü nasıl yiyebildiğini bilmek istiyorum! Goring'çiyi defalarca geçirdim ve hiçbir zaman göz kırpmadı. Bir 20 Gig Subversion repoyu 27 git repo'ya bölmek için kullandım ve pisliği çözmek için foo'yu filtre dallandı ve benden asla bir bayt kaybetmedi. Reflog her zaman geri çekilmek için orada. Bu sefer halı gitti!
Benim bakış açıma göre tüm yaptığım koşmak git pull
ve tüm yerel depolarımı taramaktı. Yani "teslim alınan versiyonu berbat ettin" ya da "bulunduğum dal" lafını kastetmiyorum. Yani her şey bitti .
İşte olaydaki terminalimin ekran görüntüsü:
Sana bu konuda yol göstereyim. Komut istemim, geçerli git repo (prezto'nun vcs_info uygulamasını kullanarak) hakkındaki verileri içerir, böylece git repo'nun ne zaman kaybolduğunu görebilirsiniz. İlk komut yeterince normal:
» caleb » jaguar » ~/p/w/incil.info » ◼ zend ★ »
❯❯❯ git co master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
Orada 'zend' dalında olduğumu ve ustayı kontrol ettiğimi görebilirsiniz. Çok uzak çok iyi. Bir sonraki komutumdan önce bilgi istemi içinde dalları başarıyla değiştirdiğini göreceksiniz:
» caleb » jaguar » ~/p/w/incil.info » ◼ master ★ »
❯❯❯ git pull
remote: Counting objects: 37, done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 37 (delta 25), reused 0 (delta 0)
Unpacking objects: 100% (37/37), done.
From gitlab.alerque.com:ipk/incil.info
+ 7412a21...eca4d26 master -> origin/master (forced update)
f03fa5d..c8ea00b devel -> origin/devel
+ 2af282c...009b8ec verse-spinner -> origin/verse-spinner (forced update)
First, rewinding head to replay your work on top of it...
>>> elapsed time 11s
Ve aynen böyle gitti. Geçen süre işaretçisi, 10 saniyeden uzun bir süre geçmişse bir sonraki komut isteminden önce çıkar. Git, tekrar oynatmanın geri sarıldığına dair bir bildirimde bulunmadı. Bittiğine dair bir gösterge yok.
Bir sonraki bilgi istemi, hangi şubede bulunduğumuz veya gitme durumu hakkında hiçbir veri içermiyor.
Başarısız olduğunu fark etmeden, kesinlikle bir git deposunda olmadığımı söylemek için başka bir git komutu çalıştırmaya çalıştım. PWD'nin değişmediğine dikkat edin:
» caleb » jaguar » ~/p/w/incil.info »
❯❯❯ git fetch --all
fatal: Not a git repository (or any parent up to mount point /home)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
Bundan sonra etrafa bir bakış tamamen boş bir dizinde olduğumu gösterdi. Hiçbir şey değil. '.Git' dizini yok, hiçbir şey yok. Boş.
Benim yerel git 2.0.2 sürümünde. Git yapılandırmamdan olanları yapmak için uygun olabilecek birkaç ipucu:
[branch]
autosetuprebase = always
rebase = preserve
[pull]
rebase = true
[rebase]
autosquash = true
autostash = true
[alias]
co = checkout
Örneğin git pull
, bir birleştirme yerine her zaman bir yeniden düzenleme yapmaya ayarlıyorum, böylece yukarıdaki çıktının bir kısmı normal olur.
Verileri kurtarabilirim. Diğer depolara itilmemiş, önemsiz bazı şeyler dışında başka git objeleri olduğunu sanmıyorum, ama ne olduğunu bilmek istiyorum .
Kontrol ettim:
- Dmesg'deki veya sistem günlüğündeki mesajlar. Hiçbir şey uzaktan bile alakalı değil.
- Sürücü veya dosya sistemi arızası belirtisi yok (LVM + LUKS + EXT4 hepsi normal görünüyor). Kayıp + bulunan hiçbir şey yok.
- Ben başka bir şey yapmadım. Tarihte yukarıda göstermediğim hiçbir şey yok ve bu süre zarfında başka terminal kullanılmadı.
rm
Yanlış CWD, vb. İçerisinde yürütülmüş olabilecek yüzen bir komut yoktur . - Başka bir dizindeki başka bir git repouna göz atmak,
git pull
s'yi çalıştıran hiçbir belirgin anormallik göstermez .
Burada başka ne aramalıyım?
.git
yok. Hiçbir şey yapmaz - git root dizini olarak kullanılanların içinde hiçbir şey yoktur.