git: Tüm mevcut izlenmeyen dosyalar nasıl yoksayılır?


131

Git deposundaki tüm izlenmeyen dosya ve klasörleri yok saymanın kullanışlı bir yolu var mı?
(Hakkında biliyorum .gitignore.)

Yani git statusyine temiz bir sonuç sağlayacaktır.



Veya .gitignore dosyanıza tek bir * eklemek isteyebilirsiniz. :)
vilicvane

1
Sadece bir *irade çok büyük olasılıkla istediğin şey olmayacak.
sjas


Pek çok yanlış cevap karşısında şaşırdım. -u noHata. -unodoğru. -u noadlı bir dosyada durum yapmayı dener no! noOlduğu değil bir argüman -u. noBir argüman olarak yorumlanmaya zorlamak için -uboşluk olmamalıdır. Bunu test etmek için yapmak touch Invalidve karşılaştırmak git status -uInvalidiçin git status -u Invalid.
Aaron McDaid

Yanıtlar:


252

Daha önce de söylendiği gibi, statü dışında bırakmak için şunu kullanın:

git status -uno  # must be "-uno" , not "-u no"

Bunun yerine şu anda izlenmeyen dosyaları kalıcı olarak yok saymak istiyorsanız, projenizin kökünden başlatabilirsiniz:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

Sonraki her çağrı git statusbu dosyaları açıkça yok sayacaktır.

GÜNCELLEME : Yukarıdaki komutun küçük bir dezavantajı vardır: .gitignorehenüz bir dosyanız yoksa gitignore'unuz kendisini yok sayacaktır! Bunun nedeni dosyanın çalıştırılmadan .gitignoreönce oluşturulmasıdır git status --porcelain. Dolayısıyla, .gitignorehenüz bir dosyanız yoksa şunu kullanmanızı öneririm:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

Bu , dosya oluşturulmadan önce tamamlanan bir alt kabuk .gitignoreoluşturur.

KOMUT AÇIKLAMASI çok oy aldığım için (teşekkür ederim!) Komutu biraz açıklamam gerektiğini düşünüyorum:

  • git status --porcelainyerine kullanılır git status --shortçünkü manuel devletler "komut dosyaları için bir kolay ayrıştırma biçiminde çıkış verin. Bu kısa çıkışına benzer, ancak git sürümlerinde kararlı ve bağımsız kullanıcı yapılandırma kalacaktır." Böylece hem ayrıştırılabilirliğe hem de kararlılığa sahibiz;
  • grep '^??'sadece ile başlayan ??ve git durum kılavuzuna göre izlenmeyen dosyalara karşılık gelen satırları filtreler ;
  • cut -c4- her satırın ilk 3 karakterini kaldırır, bu da bize izlenmeyen dosyanın sadece göreceli yolunu verir;
  • |semboller borular , aşağıdaki komutun girişine önceki komut çıkış geçmesi;
  • >>ve >semboller yönlendirme operatörler Bir dosya veya üzerine yazma önceki komutun çıktısını eklemeye, / sırasıyla yeni bir dosya oluşturur.

BAŞKA VARIANT tercih edenler için kullanansed yerine grepve cutburada başka bir yol:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore

3
cut -c4- her satırın ilk 4 karakterini kaldırır, bu da bize izlenmeyen dosyanın sadece göreceli yolunu verir; No. -c, kesilecek sütun numaraları listesinin başlangıcını gösterir. Ve 4. sütundan sona kadar olan satırı 4- seçer , bu da sütun 1-3'ü keser. Dolayısıyla, kesme komutunuz aslında her satırın ilk 3 karakterini kaldırır. Buradaki gibi bir git durum satırından 4 karakter ?? app/views/static_pages/contact.html.erbkaldırırsanız :, ' nin ilk harfini kaldırırsınız app. Yani komut doğrudur ama açıklama hatalı.
7

@ 7stud: teşekkür ederim, haklısın, yanlışlıkla 4 yazdım. Cevabı düzelttim.
Diego

2
Komutun açıklamasını gerçekten takdir ediyorum. İnternetten kopyaladığım rastgele komutların ne yaptığını bilmek güzel ve komut satırını ve gitmeyi daha iyi kullanmayı öğrenmemize yardımcı oluyor.
Eric Fitting

1
-u nobenim için çalışmıyor. Ama -unoöyle. Cevabı buna göre güncelledim. Bu git için garip bir tasarım. Git 1.7.1
Aaron McDaid

2
@AaronMcDaid: teşekkürler. Değişiklik burada belgelendi ve burada
Diego

51

Bu dosyaları kalıcı olarak yok saymak istiyorsanız, onları eklemenin basit bir yolu .gitignoreşudur:

  1. Git ağacının köküne geçin.
  2. git ls-files --others --exclude-standard >> .gitignore

Bu, izlenemeyen dizinlerdeki tüm dosyaları numaralandırır; bu, istediğiniz gibi olabilir veya olmayabilir.


3
Neden bu kadar çok oy almıyor? Diğer 2 programı karıştırmaya gerek yok!
JoelFan

4
@JoelFan: iki neden: 1) bu yalnızca git'in kökünden çalışır, kabul edilen her alt dizinden çalışır, yalnızca hedef .gitignoreyolunu ayarlamanız gerekir 2) izlenmeyen bir dizininiz varsa, bu her birini listeler ve içindeki her bir dosya, ancak izlenmeyen dizinin kendisi değil (böylece dizini görmezden gelmezsiniz ve böylece dizinde ilerideki dosyaları izlenmemiş olarak rapor edilirken, kabul edilen dosya içindeki izlenmeyen dosyaları değil, yalnızca dizini listeler. . Bu, ne yapmak istediğinizle ilgili bir mesele, ancak çoğu kez tüm dizini görmezden gelmek istersiniz
Diego

1
Teşekkür ederim ben fark takdir Poolie ait Öneriniz çünkü dosya ve klasörlerin bir kütüphane ile çalışan @Diego I tarafından belirtilen noktaların başladı ve ben / izlemek Orijinal dosyaları itmek istemiyorum. Yalnızca kitaplığa eklediğim veya yeniden oluşturduğum dosyaları izlemek istiyorum. Üst klasörleri eklemek her şeyi göz ardı eder. Bu / çözümünüz bir çırpıda 1696 dosyanın tümünü ekledi. xD
Chaos7703

Bu aynı zamanda kullanılarak da elde edilebilir git config status.showUntrackedFiles no.
larsch

16

İçinde buldum manuel

Mode parametresi, izlenmeyen dosyaların işlenmesini belirtmek için kullanılır. İsteğe bağlıdır: varsayılan olarak tümüdür ve belirtilirse, seçeneğe yapıştırılmalıdır (örn. -Uno, ancak -u no değil).

git status -uno


39
Peki, eğer herkes yayınlamadan önce RTFM yapsaydı, hiçbirimiz bir temsilci alamazdık :-)
Jenny D

4

İki yol:

git-status için "-uno" bağımsız değişkenini kullanın. İşte bir örnek:

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

Veya dosyaları ve yönergeleri .gitignore'a ekleyebilirsiniz, bu durumda hiçbir zaman görünmezler.


2
Düzenleme kullanışlı bir yoldur .gitignorevarlık git status | cat >> temp && vim temp. Ardından dosyayı düzenleyerek ilk birkaç satır ve son satırın yanı sıra sondaki #ve ondan sonraki beyaz boşluklar silinir . Sonra cat temp >> .gitignore && rm temp. Daha .gitignoreönce hiç olmaması durumunda , mv temp .gitignoreyapacak. Çirkin şeyler ama .gitignoreelle güncellemekten daha iyi .
sjas

1
Bu cevap yanlış. Doğru cevap -uno. Kullanırsanız -u no, eşdeğerdir no -u- adlı bir dosyada no(muhtemelen mevcut olmayan) bir durum yapacak ve varsayılan -umodu kullanacaktır . yani eşdeğerdirgit status no
Aaron McDaid

3

-u nohazırlanmamış dosyaları da göstermez. -unoistenildiği gibi çalışır ve aşamasız olarak gösterilir, ancak izlenmeyenleri gizler.


1
Bu bile tam olarak doğru değil. git status -u Xeşdeğerdir git status X -u( Xbir argüman değildir -u). Bu da eşdeğerdir git status X(çünkü -uargümansız öntanımlıdır -u). Bu nedenle, dosyada basitçe bir git durumudur X. Yani, eğer Xolduğunu nobasitçe adında bir dosya üzerinde bir git durumunu yapmaya çalışır nomuhtemelen yok
Aaron McDaid

2

Durumda sizin gibi Unix bulunmayan OS, bu konuda çalışacak , Windows kullanan PowerShell

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

Bununla birlikte, .gitignoredosyanın yeni bir boş satırı olması gerekir, aksi takdirde içeriği olsun ya da olmasın son satıra metin ekler.

Bu daha iyi bir alternatif olabilir:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore


1

Eğer varsa bir sürü izlenmeyen dosyaları ve "istemiyorum gitignore, hepsi" beri, o notu Git 1.8.3 (Nisan 2013, 22d) , git statussöz edecek --untracked-files=nosen o seçenek eklemek olmasa bile ilk yer!

" git status", kullanıcılara --untracked=noçok uzun sürdüğünde seçeneği kullanmayı düşünmelerini önerir .


0

Buraya biraz farklı bir sorunu çözmeye geldim. Belki bu başkası için faydalı olacaktır:

Yeni bir şube oluşturuyorum feature-a. bu dalın bir parçası olarak yeni dizinler yaratıyorum ve bazılarını bastırmak için .gitignore'u değiştirmem gerekiyor. Bu, çeşitli önbellek klasörleri oluşturan bir projeye yeni araçlar eklerken çok olur. .serverless, .terraformVb

Bunu ustalıkla birleştirmeye hazır olmadan önce başka bir şey var, bu yüzden mastertekrar kontrol ediyorum , ancak şimdi git status.gitignore henüz birleştirilmediğinden, bu bastırılmış klasörleri tekrar alıyorum.

Buradaki cevap aslında basit, ancak anlamak için bu blogu bulmam gerekiyordu:

Sadece gelen .gitignore dosyayı teslim feature-adalı

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
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.