Dizine eklediğiniz tüm dosyaları (örneğin sizin durumunuzda olduğu gibi) kurtarabilmeniz gerekir, git add .
ancak biraz iş olabilir. Dizine bir dosya eklemek için git, onu nesne veritabanına ekler; bu, çöp toplama henüz gerçekleşmediği sürece dosyanın kurtarılabileceği anlamına gelir. Jakub Narębski'nin cevabında bunun nasıl yapılacağına dair bir örnek var:
Ancak, bunu bir test deposunda denedim ve birkaç sorun vardı - --cached
olmalıydı --cache
ve .git/lost-found
dizini gerçekten oluşturmadığını buldum . Ancak, aşağıdaki adımlar benim için çalıştı:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
Bu, nesne veritabanındaki herhangi bir ref, indekste veya reflog aracılığıyla erişilemeyen tüm nesnelerin çıktısını almalıdır. Çıktı şunun gibi görünecek:
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
... ve bu lekelerin her biri için şunları yapabilirsiniz:
git show 907b308
Dosyanın içeriğini çıkarmak için.
Çok fazla çıktı mı?
Sehe'nin aşağıdaki yorumuna yanıt olarak güncelleme :
Bu komutun çıktısında listelenen çok sayıda işlem ve ağaç olduğunu fark ederseniz, başvurulmayan işlemlerden referans verilen nesneleri çıktıdan çıkarmak isteyebilirsiniz. (Genellikle bu işlemlere reflog aracılığıyla geri dönebilirsiniz - biz sadece dizine eklenen, ancak hiçbir zaman bir kaydetme yoluyla bulunamayan nesnelerle ilgileniyoruz.)
İlk olarak, komutun çıktısını şu şekilde kaydedin:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all
Artık ulaşılamayan bu işlemlerin nesne adları şu şekilde bulunabilir:
egrep commit all | cut -d ' ' -f 3
Dolayısıyla, yalnızca dizine eklenmiş, ancak herhangi bir noktada taahhüt edilmemiş ağaçları ve nesneleri şu şekilde bulabilirsiniz:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \
$(egrep commit all | cut -d ' ' -f 3)
Bu, dikkate almanız gereken nesnelerin sayısını büyük ölçüde azaltır.
Güncelleme: Aşağıdaki Philip Oakley , dikkate alınacak nesnelerin sayısını azaltmanın başka bir yolunu öneriyor; bu, yalnızca altındaki en son değiştirilen dosyaları dikkate almaktır .git/objects
. Bunları şununla bulabilirsiniz:
find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort
(Bu find
çağrıyı burada buldum .) Bu listenin sonu şöyle görünebilir:
2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b
2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a
Bu durumda, bu nesneleri aşağıdakilerle görebilirsiniz:
git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b
git show de629830603289ef159268f443da79968360913a
( /
Nesne adını almak için yolun sonundaki öğesini kaldırmanız gerektiğini unutmayın .)