Git'i güvenilir bir şekilde “betiklemenin” anahtarı 'sıhhi tesisat' komutlarını kullanmaktır.
Geliştiriciler, tesisat komutlarını değiştirirken çok kararlı arabirimler sağladıklarından emin olmak için dikkat ederler (örneğin, belirli bir depo durumu, stdin, komut satırı seçenekleri, argümanlar vb. Kombinasyonu, komutun / seçeneği var). Sıhhi tesisat komutlarındaki yeni çıktı varyasyonları yeni seçeneklerle tanıtılabilir, ancak bu eski sürümlere karşı yazılmış olan programlar için herhangi bir sorun yaratamaz (mevcut olmadıklarından (veya en azından kullanılmaz).
Ne yazık ki 'günlük' Git komutları 'porselen' komutlarıdır, bu nedenle Git kullanıcılarının çoğu sıhhi tesisat komutlarına aşina olmayabilir. Porselen ve sıhhi tesisat komutu arasındaki ayrım ana git man sayfasında yapılır ( Yüksek seviye komutları (porselen) ve Düşük seviye komutları (tesisat) başlıklı alt bölümlere bakın .
İstenmeyen değişiklikleri öğrenmek için, muhtemelen git diff-index(diğer ağaç ağaçlarıyla (örneğin HEAD) çalışma ağacının dizinini (ve belki de izlenen çalışma ağaç parçalarını ) git diff-fileskarşılaştırmanız ), belki (çalışma ağacını dizine göre karşılaştır) ve muhtemelen git ls-files(liste dosyalarını; örneğin izlenmeyenleri listele) , imzalanmamış dosyalar).
(Aşağıdaki komutlarda HEAD --bunun yerine kullanıldığından, HEADaksi halde adlandırılmış bir dosya varsa komutun başarısız olduğunu unutmayın HEAD.)
Bir havuzun (henüz işlenmemiş) değişiklikler sahnelediğini kontrol etmek için şunu kullanın:
git diff-index --quiet --cached HEAD --
- Eğer çıkarsa
0, hiçbir fark yoktu ( 1farklılıklar olduğu anlamına gelir).
Çalışan bir ağacın aşamalandırılabilecek değişiklikler olup olmadığını kontrol etmek için:
git diff-files --quiet
- Çıkış kodu
git diff-index( 0== fark yok; 1== fark) ile aynıdır .
Çalışma ağacındaki dizin ve izlenen dosyaların kombinasyonunun aşağıdakilere göre değişiklik gösterip göstermediğini kontrol etmek için HEAD:
git diff-index --quiet HEAD --
- Bu, önceki ikisinin bir kombinasyonu gibidir. Bir asıl fark, çalışma ağacında “geri aldığınız” aşamalı bir değişikliğiniz varsa (içinde bulunan içeriğe geri döndüğünüzde) “fark yok” rapor etmesidir
HEAD. Aynı durumda, iki ayrı komutun her ikisi de “mevcut farklılıklar” raporlarını döndürür.
İzlenmeyen dosyalardan da bahsettiniz. "İzlenmemiş ve işaretsiz" anlamına gelebilir ya da yalnızca "izlenmemiş" (gözardı edilen dosyalar dahil) anlamına gelebilirsiniz. Her iki durumda da git ls-files, işin aracı:
"İzlenmemiş" için (varsa yok sayılan dosyaları içerir):
git ls-files --others
"İzlenmemiş ve işaretsiz" için:
git ls-files --exclude-standard --others
İlk düşüncem, bu komutların çıktısı olup olmadığını kontrol etmektir:
test -z "$(git ls-files --others)"
0İle çıkarsa izlenmemiş dosya yoktur. 1İle çıkarsa izlenmemiş dosyalar vardır.
Bunun anormal çıkışları git ls-files“izlenmeyen dosya yok” raporlarına dönüştürmesi için küçük bir şans vardır (her ikisi de yukarıdaki komutun sıfırdan farklı çıkışlarıyla sonuçlanır). Biraz daha sağlam bir sürüm şöyle görünebilir:
u="$(git ls-files --others)" && test -z "$u"
- Fikir önceki komutla aynıdır, ancak beklenmeyen hataların
git ls-filesyayılmasına izin verir . Bu durumda sıfır dışında bir çıkış “izlenmeyen dosyalar var” anlamına gelebilir veya bir hata oluştuğu anlamına gelebilir. Bunun yerine "hata" sonuçlarının "izlenmeyen dosya yok" sonucuyla birleştirilmesini istiyorsanız, test -n "$u"(burada çıkış 0"bazı izlenmemiş dosyalar" anlamına gelir ve sıfırdan farklı olması ise hata veya "izlenmeyen dosyalar" anlamına gelir).
Başka bir fikir, --error-unmatchizlenmemiş dosya olmadığında sıfırdan farklı bir çıkışa neden olmaktır. Bu aynı zamanda “izlenmeyen dosya yok” (çıkış 1) ile “hata oluştu” (sıfırdan çıkma, ancak büyük olasılıkla çıkış ) riskiyle de karşılaşır 128. Ama kontrol 0vs 1vs sıfır olmayan çıkış kodları muhtemelen oldukça sağlamdır:
git ls-files --others --error-unmatch . >/dev/null 2>&1; ec=$?
if test "$ec" = 0; then
echo some untracked files
elif test "$ec" = 1; then
echo no untracked files
else
echo error from ls-files
fi
Yalnızca izlenmeyen ve imzalanmamış dosyaları dikkate git ls-filesalmak --exclude-standardistiyorsanız yukarıdaki örneklerden herhangi biri geçerli olabilir .