git add * (yıldız işareti) vs git add. (Nokta)


130

Git'te yeniyim ve git'e dosya eklemeyle ilgili bir sorum var. Ben arasındaki fark ile ilgili çoklu stackoverflow sorular bulduk git add .ve git add -a, git add --all, git add -Avb Ama ne olduğunu açıklıyor bir yer bulmak mümkün oldum git add *yapar. Git add man sayfasına bile baktım ama yardımcı olmadı. Onun yerine kullanıyorum git add .ve iş arkadaşım bana nedenini sordu. Bir cevabım yoktu. Ben her zaman kullandım git add *.

Are git add .ve git add *aynı? Biri yalnızca geçerli dizinden değiştirilen dosyaları eklerken, diğeri mevcut dizinden ve alt dizinlerden (özyinelemeli olarak) dosya ekliyor mu?

Diğer yığın sorularından birinde listelenen git add -A git add .ve arasındaki farkı gösteren harika bir tablo var git add -u, ancak yok git add *.

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

Not: Yıldız işaretini joker karakter olarak kullanmanın ne anlama geldiğini anlıyorum (belirli bir uzantıya sahip tüm dosyaları ekleyin). Örneğin, git add *.htmlbir tüm dosyaları eklersiniz .html(ama görmezden uzantısı .css, .jsvs.).

Yardım için teşekkürler!


1
Bu tablo nereden? git add .Tekrar denedim ve silinmiş bir dosyayı sahneledi X, o satırdaki önerinin aksine sorun yok .
David

@David Bu görüntü bu yanıttan ve git'in eski sürümleri için geçerli.
jerry

4
Resim modası geçmiş! Git 2.x farklı: i.stack.imgur.com/KwOLu.jpg
Hannes Schneidermayer

Yanıtlar:


132

add *adı nokta ile başlayan dosyalar dışında geçerli dizindeki tüm dosyaları eklemek anlamına gelir. Bu, sizin kabuk işlevinizdir ve Git yalnızca bir dosya listesi alır.

add . Kabuğunuzda özel bir anlamı yoktur ve bu nedenle Git, dizinin tamamını özyinelemeli olarak ekler, bu neredeyse aynıdır, ancak adları bir noktayla başlayan dosyaları da içerir.


6
bu nedenle git add ., .gitignore ve nokta ile başlayan her şey dahil olmak üzere tüm dosyaları, klasörleri ve alt klasörleri git add *eklerken, nokta ile başlayanlar dışında herhangi bir dosya, klasör ve alt klasör ekleyecektir. Bu doğru mu?
Tyler Youngblood

9
Bu gerçekten doğrudur. Ayrıca, git add *bir alt dizindeyse, nokta ile başlayan dosyaları yine de ekler.
Denis

4
git add .ayrıca .gitignore'a saygı duyar, oysa git add *nokta olmayan dosyalar gitignored ise bir hata verir. Çok daha iyi kullanmak git add .daha git add *.
rosuav

2
Dikkate değer özellikleri: CMD.EXE, 's den DOS / Windows üzerinde Git çağırma eğer Git genişler, değil kabuk, *. Bu durumda Git, nokta dosyalarını bulacaktır.
torek

2
@ Thor84no: Git *, kabuktan korumak için alıntı yaparsanız, Linux sistemlerinde bile nokta dosyalarını bulacaktır . Bu bir gizli parça meselesi değil, sadece Git'in derlenmiş kuralları farklıdır.
torek

30

*git'in bir parçası değil - kabuk tarafından yorumlanan bir joker karakter. *geçerli dizindeki tüm dosyalara genişler ve ancak o zaman git'e aktarılır, addhepsi bu. .mevcut dizinin kendisidir ve git addonu ve altındaki tüm dosyaları ekler.


1
Öyleyse, yıldız işaretini kullanmak için her neden var mı? Bir dönem yerine kullanmanın bir avantajı var mı? Ya da tam tersi? Eminim bunu bir eğitimde görmüşümdür. Başka türlü kullanacağımı bilemezdim. Pek bir komut satırı adamı değilim (şüphesiz tahmin ettiğiniz gibi).
Tyler Youngblood

5
*gizli dosyaları (yani adlarının a ile başlayan dosyaları) engeller .. Her halükarda, belirli dosyalar eklemiyorsanız, sadece kullanırım git add -u(veya git add -Ayeni dosyalar oluşturuyorsanız).
Mureinik

3
Sorumu ikiniz de cevapladığınız için kime kredi vereceğime karar vermekte zorlandım. Aşağıda Denis'i seçtim çünkü senden daha az itibarı var. Bu yüzden ona yeşil çek vermenin ona faydasından daha çok fayda sağlayacağını düşündüm. Umarım bu mantıklıdır? Ama her iki açıklamayı da gerçekten takdir ediyorum. Teşekkürler!
Tyler Youngblood

7

. Kabukta noktanın kullanılması genellikle "mevcut dizin" anlamına gelir.

Yıldız işaretini *bir kabukta file-globbingkullandığınızda adı verilen bir özellik kullanılır. Örneğin, bash üzerinde işlev glob()tam da bunu yapıyor. Glob ( man 7 glob) için manpage şunu belirtir:

AÇIKLAMA

Long ago, in UNIX V6, there was a program /etc/glob that would expand 
wildcard patterns.  Soon afterward this became a shell built-in.
These days there is also a library routine glob(3) that will perform this 
function for a user program.

Joker karakter eşleme

A string is a wildcard pattern  if it contains one of the characters '?', '*' or '['. 

globbing

Globbing is the operation that expands a wildcard pattern 
into the list of pathnames matching the pattern.

Yani ihtiva komut satırında herhangi bir programa argüman geçmemize araçları '?', '*'ya da '['birinci globbing dosyaların bir liste halinde joker desen genişler ve daha sonra programın kendisinde bir argüman olarak bu dosyaları verir.

Arasında, yani fark 'git add .'ve 'git add *'açık bir şekilde tarif edilir Denis :

git adddosya listesinin eklenmesini bekler. Yukarıdaki örnekte, kabuk *veya .sırasıyla genişler ve sonucu git add'ye bir parametre olarak verir. Şimdi fark, git add .git ile geçerli dizine git add *genişlerken, dosya genellemesini tetikler ve bu, bir nokta ile başlamayan tüm dosya ve dizinlere genişler.


5

Açıklık için cevabı aşağıdaki tabloya koydum:

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

Ek notlar (@ reka18 yorumundan esinlenilmiştir):

Not 1 git add -A ve git add -uek parametreler olmadan gerçekleştirilen komutlar, tüm çalışma dizini aralığında ek iyileştirme (dosya adı için alt dizin veya maske göstergesi) olacaktır (ayrıca komutu dizinin çalışma alt dizininde yürütürsek).

2. Not. ve *sırasıyla komutun yolu açıklamak dizin yolu (mevcut dizin) ve joker vardır. Örneğin, git add .veya git add *komutu bir çalışma dizininin bazı alt dizinlerinde çalıştırılırsa, eylemi yalnızca bu alt dizin içinde kullanılır, tüm çalışma dizini içinde kullanılmaz.

Not 3.git add -A ve git add -ukomutlar ayrıca bir yolunu ekleyerek veya örneğin dosyalar için maske, rafine edilebilir git add -A app/controllersveya git add -u app\styles\*.


2
Yani Git v2.x itibariyle git add -Ave git add .aynı mı?
reka18

Çok güzel bir soru için @ reka18 teşekkür ederiz. Cevabımı tamamlamam için bana ilham verdi ... Sorunuzun cevabı: Eğer onu çalışma dizininde çağırırsanız, hayır, ancak bir alt dizindeyse, o zaman evet ( git add -Atüm çalışma dizini ve git add .her zaman geçerli dizin için geçerlidir).
simhumileco

2
  • git add -A (--all) Diskteki klasörünüzdeki her şeyin hazırlama alanında temsil edilmesi için her şeyi ekler

  • git add . Her şeyi aşamalar, ancak diskten silinen dosyaları kaldırmaz

  • git add * Her şeyi aşamalar, ancak bir noktayla başlayan dosyaları değil ve diskten silinmiş dosyaları kaldırmaz

  • git add -u (--update) Yalnızca Değiştirilmiş Dosyaları Aşamalar, diskten silinen dosyaları kaldırır, yeni eklemez

  • git add <file name 1> <file name 2> Yalnızca belirli dosyaları ekler

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.