Zaten çok sayıda dosyayı izleyen mevcut bir depoya .gitignore uygulayın


314

Depomda var olan bir Visual Studio projem var. Yakın zamanda projemin altına bir .gitignore dosyası ekledim ve Git'e dosyada listelenen dosyaları yok saymasını söyler.

Benim sorunum, tüm bu dosyalar zaten izleniyor ve bildiğim kadarıyla Git, bu dosyaya bir kural eklenmeden önce zaten izlenen bir dosyayı yok saymayacak.

Kullanılması önerildi: git rm --cachedve bunları manuel olarak takip etmedim, ancak bu onları sonsuza kadar tek tek geçmem için alacak.

Depoyu silmeyi ve yeniden oluşturmayı düşündüm ama bu sefer .gitignore dosyası mevcut, ancak bunu yapmanın daha iyi bir yolu olmalı.


1
yardımcı olması halinde git rm --cachedtüm dizinleri -rseçenekle yapabilirsiniz
Nathan Wallace



Yanıtlar:


870

Bu cevap sorunumu çözdü:

Her şeyden önce, bekleyen tüm değişiklikleri yapın.

Ardından şu komutu çalıştırın:

git rm -r --cached .

Bu, her şeyi dizinden kaldırır, ardından şunu çalıştırın:

git add .

Taahhüt et:

git commit -m ".gitignore is now working"

9
Mükemmel cevap ! Lütfen git push originuzak depodaki değişiklikleri yansıtmak için bir de ekleyin .
Sanket Berde

8
Bu cevabı kullanmaya başladım ... ve projemdeki neredeyse her şeyi sildi! Açıkçası yanlış bir şey yapıyordum. Ama insanları bu öneriyi rahatlıkla takip etmemeleri konusunda uyarmak istiyorum.
Mark Olbert

4
Bu, onları kaldırdığınızda ve yeniden eklediğinizde dosyaların geçmişini kaybediyor mu
Aran Mulholland

10
Bu .gitignore is now workingmesajı kaç komisyon kullandığını merak ediyorum . :)
ihavenoidea

1
Bu yöntem benim için iyi çalıştı. Bir gitignore dosyası oluşturdum, tüm bir dizini yok saydım, sonra gitignore'u oluşturmada bu değişikliği yaptım. Daha sonra yukarıdaki üç komutu aynen söyledikleri gibi uyguladım. Mükemmel çalıştı, ancak söylemeliyim ki, yukarıda belirtildiği gibi "beklemedeki tüm değişiklikleri yapmalısınız".
Erich Meissner

61
  1. Bir .gitignore dosyası oluşturun, bunun için herhangi bir boş .txt dosyası oluşturun.

  2. Ardından cmd'de aşağıdaki satırı yazarak adını değiştirmeniz gerekir ( git.txtaz önce oluşturduğunuz dosyanın adıdır):

    rename git.txt .gitignore

  3. Daha sonra dosyayı açabilir ve yoksaymak istediğiniz tüm izlenmemiş dosyaları iyice yazabilirsiniz. Örneğin, benimki şöyle:

`

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Bir var GitHub'dan tarafından kullanışlı .gitignore dosyalarının Bütün koleksiyon

  1. Bunu yaptıktan sonra, diğer herhangi bir dosya gibi git deponuza eklemeniz gerekir, sadece deponun kökünde olması gerekir.

  2. Sonra terminalinizde aşağıdaki satırı yazmanız gerekir:

    git config - global core.excludesfile ~ / .gitignore_global

Resmi doktordan:

Ayrıca, bilgisayarınızdaki her Git deposundaki dosyaları yok saymak için kuralların bir listesi olan genel bir .gitignore dosyası da oluşturabilirsiniz. Örneğin, dosyayı ~ / .gitignore_global adresinde oluşturabilir ve dosyaya bazı kurallar ekleyebilirsiniz.

Terminal'i açın. Terminalinizde şu komutu çalıştırın: git config --global core.excludesfile ~ / .gitignore_global

Kaynak zaten varsa, şu komutları çalıştırmanız gerekir:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

Adım 2 işe yaramazsa, eklemek istediğiniz dosyaların delik yolunu yazmalısınız.


4
@Karen_Wiznia "git config ... _global" bilgisayardaki tüm Git depoları için genel bir gitingore oluşturur. OP bunu yapmak istemedi.
ivan7707

Keşke bunu bir kereden fazla beğenebilseydim, sürekli olarak bu hatırlatıcıyı arayan bu soruya geri dönersem.
Antony D'Andrea

1
"Git.txt .gitignore adını değiştir" yerine "mv git.txt .gitignore" olmalıdır.
Ahmad F

30

Belirtildiği gibi burada Sen endeksi güncelleyebilirsiniz:

git update-index --assume-unchanged /path/to/file

Bunu yaptığınızda, dosyalar git statusveya içinde görünmez git diff.

Dosyaları tekrar izlemeye başlamak için şunları çalıştırabilirsiniz:

git update-index --no-assume-unchanged /path/to/file

5
Bu daha iyi bir yanıttır - sadece tek bir dosyaya, depo tarafından izlenmesini istemediğiniz dosyaya odaklanır. En yüksek işaretli cevap da işe yarayacaktır, ancak bir dosyayı git ile izlemekten yoksaymaktan çok daha fazlasını yapar.
Chris Mejka

1
Bu iyi bir tane. Ama ya çekersek? Herhangi bir birleşme çatışması var mı?
pramod

@pramod, harika bir soru. Gerçekten emin değilim. Soyulmuş bir test deposunda denemek ister misiniz?
Patrick James McDougle

15

Eklediyseniz .gitignoreÇok geç git, zaten taahhüt edilmiş olan dosyaları izlemeye devam edecektir. Bunu düzeltmek için, istenmeyen dosyaların önbelleğe alınmış tüm örneklerini her zaman kaldırabilirsiniz.

İlk olarak, gerçekte hangi dosyaları izlediğinizi kontrol etmek için şunları çalıştırabilirsiniz:

git ls-tree --name-only --full-tree -r HEAD

Diyelim ki böyle bir dizinde istenmeyen dosyalar buldunuz cache/, tüm dosyalarınız yerine bu dizini hedeflemek daha güvenli.

Bunun yerine:

git rm -r --cached .

İstenmeyen dosyayı veya dizini hedeflemek daha güvenlidir:

git rm -r --cached cache/

Ardından tüm değişiklikleri eklemeye devam edin,

git add .

ve taahhüt ...

git commit -m ".gitignore is now working"

Referans: https://amyetheredge.com/code/13.html


Deponun tamamını değil, yalnızca birkaç dosyayı kaldırmak istiyorsanız bu en iyi ve temiz yanıttır. Sana başparmaklarımı veriyorum.
Apuig

2

Geçerli hariç tutma desenleri kümesi altında yoksayacak olan dosyaları "kaldırmanın" bir yolu:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Bu, dosyaları çalışma dizininizde bırakır, ancak dizinden kaldırır.

Burada kullanılan hile git ls dosyalarına varolmayan bir dizin dosyası sağlamaktır, böylece izlenen dosya olmadığını düşünür. Yukarıdaki kabuk kodu, dizin boş olsaydı yoksayılacak tüm dosyaları sorar ve git rm ile gerçek dizinden kaldırır.

Dosyalar "izlendikten" sonra, önemli bir şeyin kaldırılmadığını doğrulamak için git durumunu kullanın (bu durumda hariç tutma kalıplarınızı ayarlayın ve kaldırılan dizin girişini geri yüklemek için git reset - yolunu kullanın). Ardından, "kabuğunu" ortadan kaldıran yeni bir taahhütte bulunun.

“Kabuk” hala eski taahhütlerde olacak. Gerçekten temiz bir geçmişe ihtiyacınız varsa eski taahhütlerin temiz sürümlerini üretmek için git filtre-dalını kullanabilirsiniz (git filtre-dalını kullanmak nb "geçmişi yeniden yazacaktır", bu nedenle, çektiğiniz ortak çalışanlarınız varsa hafifçe gerçekleştirilmemelidir. "crud" ilk kez sunulduktan sonra tarihsel taahhütlerinizden herhangi biri).


sağlam bir çözüm gibi geliyor :) Bunun Linux kabuğu için olduğunu düşünüyoruz değil mi? ne yazık ki ben bir Win7 kullanıcısıyım. Bunu pencerelerde yapabilir miyim?
Tohid

0

Hazırlama alanından dosyaları kaldırma

git reset HEAD .

Tüm değişiklikleri ekle

git add .

Taahhüt et:

git commit -m ".gitignore is now working"

-1

Bu var olan bir depoya bir .gitignore dosyası eklemek için kolay bir yol olduğunu düşünüyorum .

Önkoşul :

Github hesabınıza erişmek için bir tarayıcıya ihtiyacınız var.

adımlar

  1. Gerekli (mevcut) projenizde yeni bir dosya oluşturun ve .gitignore olarak adlandırın . Dosyayı .gitignore olarak adlandırdığınızda, .gitignore şablonları için bir öneri alırsınız . Gitignore dosyanızın içeriğini oluşturmak için bu şablonları kullanın veya gitignore.io kullanın .
  2. Değişiklikleri yapın.
  3. Şimdi bu depoyu klonlayın.

İyi eğlenceler!


-3

git clean
Bu koşu hakkında yardım al'ı kullanın

git clean -h

İlk önce ne olacağını görmek istiyorsanız, kuru çalışma için -n anahtarını geçtiğinizden emin olun:

git clean -xn

Gitingnored çöp kaldırmak için

git clean -xdf

Dikkat: Kaldırılacak olan database.yml gibi yerel yapılandırma dosyalarını yok sayıyor olabilirsiniz. Kendi sorumluluğunuzdadır kullanın.

Sonra

git add .
git commit -m ".gitignore is now working"
git push
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.