Git'i izlenen ancak şu an .gitignore'da olan bir dosyayı "unutmasını" nasıl sağlayabilirim?

git tarafından izlenen bir dosya var, ancak şimdi dosya .gitignore listesinde.

Ancak, bu dosya git status sonra git status görüntülenmeye devam eder. git tamamen unutmasını nasıl sağlıyorsun?

4082
13 авг. Ivan 13 Ağustos ayarlandı . 2009-08-13 22:23 '09, 10:23, 2009-08-13 22:23
@ 22 cevap

.gitignore izlenmeyen dosyaların git tarafından izlenen dosya grubuna ( add -f ) eklenmesini önler, ancak git zaten izlenen dosyaları izlemeye devam eder.

Bir dosyayı izlemeyi durdurmak için dizinden çıkarmanız gerekir. Bu, bu komut kullanılarak elde edilebilir.

 git rm --cached <file> 

Bir dosyayı revizyon başlığından silmek bir sonraki işlemde gerçekleşir.

NOT: Bu fiziksel dosyayı yerel dosyanızdan kaldırmayacak olsa da, bir sonraki git pull diğer geliştiricilerin makinelerindeki dosyaları siler.

4329
13 авг. Cevap veren CB Bailey 13 Ağu 2009-08-13 23:40 '09 11:40, 2009-08-13 23:40

Aşağıdaki komutlar dizisinde Git dizinindeki tüm öğeler silinir (çalışma dizininden veya yerel repodan değil) ve ardından Git dizini yoksayılırken Git dizini güncellenir. PS. Dizin = Önbellek

Birincisi:

 git rm -r --cached . git add . 
border=0

Sonra:

 git commit -am "Remove ignored files" 
2209
30 сент. Yanıtla Matt Frear 30 Sep 2013-09-30 16:51 '13, 16:51 2013-09-30 16:51

git update-index tüm işleri benim için yapıyor:

 git update-index --assume-unchanged <file> 

Not. Bu çözüm neredeyse gitgitore sadece takip edilmeyen dosyalar için tasarlandığı için .gitignore'dan bağımsızdır.

değişiklik: bu yanıt yayınlandığı için yeni bir seçenek oluşturuldu ve bu tercih edilmelidir. Kullanıcının artık düzeltmek istemediği değiştirilmiş izlenmiş dosyalar için tasarlanan ve daha büyük bir performans elde etmek için --assume-unchanged kaydettiği --assume-unchanged . Daha fazla bilgi için medican.pw.site/questions/1817 / ... adresine bakın.

 git update-index --skip-worktree <file> 
830
27 нояб. Cevap 27 Kasım’da Konstantin’de verildi . 2013-11-27 14:24 '13, 14:24 2013-11-27 14:24
 git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached git commit -am "Remove ignored files" 

Bu, yok sayılan dosyaların bir listesini alır ve bunları dizinden kaldırır ve ardından değişiklikleri kabul eder.

237
24 мая '14 в 1:29 2014-05-24 01:29 Cevap 1 Mayıs 24, 14'te 1 : 29'da 2014-05-24 01:29

Bu komutu görüntülenemeyen dosyaları silmek için her zaman kullanıyorum. Tek satır, Unix tarzı, temiz çıktı:

 git ls-files --ignored --exclude-standard | sed 's/.*/" | xargs git rm -r --cached 

git rm -r --cached sayılan tüm dosyalarınızı listeler, içindeki boşlukları olan yolları işlemek için her çıkış satırı yerine tırnak işareti içeren bir satırla değiştirir ve herşeyi yoldan / dosyaları / dizinlerden dizinden çıkarmak için git rm -r --cached .

62
19 июня '15 в 18:42 2015-06-19 18:42 Cevap 19 Haziran 1915'te David Hernandez tarafından 18 : 42'de verildi. 2015-06-19 18:42

İzlenen dosyayı başkalarının ihtiyaç duyabileceği için alamazsanız (bir uyarı, başkaları bu değişikliği aldığında git rm --cached tuşuna git rm --cached bile, dosyaları dosya sistemlerinde silinir). Bu genellikle yapılandırma dosyasını geçersiz kılmak, kimlik doğrulama bilgilerini vb. Geçersiz kılmak için yapılır. İnsanların sorunu atlattığı yollar için lütfen https://gist.github.com/1423106 adresine bakın.

Özetlemek için:

  • Uygulamanızda eksik config-overide.ini dosyasını bulmasını ve yakalanan config.ini dosyasını kullanmasını isteyin (veya alternatif olarak, ~ / .config / myapp.ini veya $ MYCONFIGFILE)
  • Config-sample.ini dosyasını düzeltin ve gerekirse config.ini dosyasını yok sayın, kopyalamak için bir komut dosyası veya benzer bir dosya oluşturun.
  • Değişiklikleri uygulamak ve kaldırmak için gitattributes clean / luding magic'i kullanmayı deneyin; örneğin, yapılandırma dosyasını alternatif bir daldan bir özü olarak bulanıklaştırın ve yapılandırma dosyasını HEAD'den bir özü olarak temizleyin. Bu zor bir şey, acemi bir kullanıcı için tavsiye etmiyorum.
  • Konfigürasyon dosyasını, asla master ile birleştirilmeyecek olan dağıtım alanına kaydedin. Dağıtmak / derlemek / test etmek istediğinizde, bu dalla birleşir ve bu dosyayı alırsınız. Temelde, bu birleştirme / temizleme yaklaşımıdır, insanların birleştirme politikalarını ve ek git modüllerini kullanması dışında.
  • Anti-önleyici: varsayımları değişiklik yapmadan kullanmayın, yalnızca gözyaşı ile bitecektir (çünkü yanlış bir yalanın olması, değişiklikleriniz sonsuza dek kaybedilecek gibi kötü şeylere yol açabilir).
53
19 июля '12 в 3:08 2012-07-19 03:08 Cevap Seth Robertson tarafından 19 Temmuz 12, 03:08 2012-07-19 03:08 tarihinde verilmiştir.

oynatın, kilitleyin ve sonra geri döndürün. Geçmişte benim için çalıştı. Muhtemelen Goer'in bunu yapmasının bir yolu var.

51
13 авг. Yanıtlayan Joel Hooks 13 Ağu 2009-08-13 22:27 '09, 10:27, 2009-08-13 22:27

Bunu şu durumlarda kullanın:

1. Çok fazla dosyayı biçimlendirmek istiyorsunuz veya

2. gitignore dosyanızı güncellediniz

Kaynak bağlantı: http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

Zaten bazı dosyaları git deponuza eklediğinizi / aktardığınızı ve daha sonra da onları / web sitenize eklediğinizi varsayalım; bu dosyalar yine de depo endeksinizde bulunacaktır. Bu yazıda onlardan nasıl kurtulacağımızı göreceğiz.

1. Adım: Tüm değişikliklerinizi yapın.

Devam etmeden önce, .gitignore dosyası dahil tüm değişikliklerin yapıldığından emin olun.

Adım 2. Depodaki her şeyi kaldırın.

Deponuzu temizlemek için şunu kullanın:

 git rm -r --cached . 
  • rm - komut sil
  • -r özyinelemeli silme sağlayacak
  • -Cached sadece dizinden dosyaları kaldıracak. Dosyalarınız hala orada olacak.

rm komutu değişmez olabilir. Önceden ne yaptığını denemek istiyorsanız, her şeyi kontrol etmek için -n veya --dry-run ekleyin.

Adım 3: Tümünü Ekle

 git add . 

Adım 4: Düzeltme

 git commit -m ".gitignore fix" 

Deponuz temiz :)

Orada da etkili olan değişiklikleri görmek için uzaktan kumandadaki değişiklikleri tıklayın.

40
22 апр. 22 Nisan tarihinde Dheeraj Bhaskar tarafından verilen cevap 2018-04-22 21:11 '18, 21:11, 2018-04-22 21:11

Benim için işe yaramadı

(Linux'ta) ls-files --ignored --exclude-standard | xargs git rm -r --cached öneren mesajları kullanmak istedim ls-files --ignored --exclude-standard | xargs git rm -r --cached ls-files --ignored --exclude-standard | xargs git rm -r --cached . Bununla birlikte (bazıları) silinecek dosyaların adlarına gömülü newline / LF / \n karakterleri vardır. Çözümlerin hiçbiri:

 git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached git ls-files --ignored --exclude-standard | sed 's/.*/" | xargs git rm -r --cached 

Bu durumla başa çıkmak (bulunamayan dosyalar hakkında hata almak).

Bu nedenle öneririm

 git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached 

Ls-dosyaları için -z argümanını kullanır ve -0 argümanı dosya isimlerindeki "kötü" karakterleri güvenli bir şekilde / doğru şekilde kullanmak için xargs kullanır.

Git-ws-files (1) kılavuz sayfası şunları gösterir:

-Z seçeneği kullanılmazsa, yol adlarındaki TAB, LF ve ters eğik çizgi karakterleri sırasıyla \ t, \ n ve \\ olarak gösterilir.

bu yüzden dosya isimleri bu karakterlerden herhangi birini içeriyorsa çözümümün gerekli olduğunu düşünüyorum.

EDIT: Eklememi istedi - git rm herhangi bir git rm komutu gibi - örneğin kaldırmayı kalıcı kılmak için bunu yerine getirmek zorunda. git commit -am "Remove ignored files" .

38
29 дек. Cevap, 29 Aralık'ta JonBrave tarafından verildi . 2015-12-29 15:50 '16, 15:50 2015-12-29 15:50

Bunu filtrenin git şubesini kullanarak yaptım. Kullandığım tam komut man sayfasından alınmıştır:

UYARI : Bu, dosyayı tüm geçmişinden siler.

 git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD 

Bu komut, her git rm önce git rm komutunu çalıştırarak tüm işlem geçmişini yeniden oluşturur ve böylece belirtilen dosyayı atar. Komutu çalıştırmadan önce kaybolacağından yedekleme yapmayı unutmayın.

35
13 авг. Cevap 13 Ağustos'ta drrlvn verildi . 2009-08-13 22:35 '09, 10:35, 2009-08-13 22:35
  • .gitignore dosyasını güncelleyin - örneğin, izlemek istediğiniz bir klasörü ekleyin .gitignore .

  • git rm -r --cached . - İstenmeyen ve istenmeyenleri içeren tüm izlenen dosyaları sil. Yerel olarak kaydettiyseniz, kodunuz güvende olacaktır.

  • git add . - .gitignore belirtilenler hariç tüm dosyalar geri .gitignore .


@AkiraYamamoto şapkalarına doğru yöne işaret edin.

18
04 апр. Cevap Chen_Wayne 04 nisan verildi . 2016-04-04 07:09 '16, 07:09 2016-04-04 07:09

Sanırım, belki de git, kavramı nedeniyle ( “Görüntüler değil, Farklılıklar” bölümü ) dosyayı tamamen unutamaz.

Örneğin CVS kullanırken bu problem yoktur. CVS, bilgileri dosya tabanlı bir değişiklik listesi olarak saklar. CVS bilgisi, zamanla her dosyada yapılan bir dosya ve değişiklik topluluğudur.

Ancak git, projenizin durumunu her kaydettiğinizde veya kaydettiğinizde, temelde tüm dosyalarınızın şu anda nasıl göründüğünün bir resmini çeker ve bu anlık görüntünün bağlantısını saklar. bu anlık görüntüde mevcut olacaktır.

Bu 2 makale bana yardımcı oldu:

git assume-no change vs skip-worktree ve Git kullanarak izlenen dosyalarda yapılan değişiklikler nasıl görmezden gelinir

Buna bağlı olarak, dosya zaten izleniyorsa aşağıdakileri yaparım:

 git update-index --skip-worktree <file> 

Bu noktadan itibaren, bu dosyadaki tüm yerel değişiklikler göz ardı edilecek ve silinmeyecek. Dosya uzak bir dosyaya değiştirilirse, git pull sırasında bir çakışma ortaya çıkar. Durdur işe yaramayacak. Sorunu çözmek için, dosyanın içeriğini güvenli bir yere kopyalayın ve aşağıdaki adımları izleyin:

 git update-index --no-skip-worktree <file> git stash git pull 

Dosyanın içeriği silinen içerikle değiştirilecektir. Değişikliklerinizi güvenli bir yerden dosyaya yapıştırın ve tekrar çalıştırın:

 git update-index --skip-worktree <file> 

Proje ile çalışan herkes git update-index --skip-worktree <file> , pull ile ilgili herhangi bir sorun olmamalıdır. Bu çözüm, her geliştiricinin kendi proje yapılandırmasına sahip olması durumunda yapılandırma dosyaları için uygundur.

Bu, uzak bir bilgisayarda bir dosyayı her değiştirdiğinizde yapmak için çok uygun değildir, ancak uzak içerik tarafından üzerine yazılmasını engelleyebilir.

12
21 мая '17 в 18:12 2017-05-21 18:12 Cevap verilir Boolean_Type 21 Mayıs, 17, 06 : 12 2017-05-05 18:12

Kopyala / Yapıştır Yanıtı: git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status

Bu komut Git deposuna zaten aktarılmış olan dosyaları görmezden gelir, ancak şimdi bunları .gitignore .

5
19 нояб. Cevap size 19 Kasım'da verilmiştir. 2018-11-19 14:21 '18, 02:21, 2018-11-19 14:21

Matt Fear'in cevabı en etkili IMHO idi. Aşağıdakiler, yalnızca Windows'ta, istisna listelerine karşılık gelen git depolarından dosyaları silenler için sadece bir PowerShell betiğidir.

 # Get files matching exclusionsfrom .gitignore # Excluding comments and empty lines $ignoreFiles = gc .gitignore | ?{$_ -notmatch "#"} | ?{$_ -match "\S"} | % { $ignore = "*" + $_ + "*" (gci -r -i $ignore).FullName } $ignoreFiles = $ignoreFiles| ?{$_ -match "\S"} # Remove each of these file from Git $ignoreFiles | % { git rm $_} git add . 
5
25 дек. Cevap Ameer Deen 25 Aralık'ta verildi. 2013-12-25 03:51 '13, 3:51 2013-12-25 03:51

Kaybetmemeniz için dosyayı güvenli bir yere taşıyın veya kopyalayın. Sonra git rm dosyasını ve taahhüt. Dosya, daha önce verdiğiniz taahhütlerden birine veya silinmemiş olduğu başka bir şubeye döndüğünüzde görüntülenir. Ancak, gelecekteki tüm taahhütlerde dosyayı bir daha görmeyeceksiniz. Dosya yoksaymak için git ise, geri klasöre taşıyabilirsiniz ve git onu görmez.

5
13 авг. Tarafından verilen cevap Apreche 13 Ağu 2009-08-13 22:27 '09, 10:27, 2009-08-13 22:27

Aşağıdaki adımları sırayla uygulayın, her şey yoluna girecek.

1. Yanlış eklenmiş dosyaları dizinden / havuzdan silin . "Rm -r" komutunu (linux için) kullanabilir veya dizinleri tarayarak silebilirsiniz.

2. gitignore dosyasındaki dosyaları / dizinleri gitignore ve kaydedin.

3. Şimdi bu komutları kullanarak git önbellekten bunları silin (eğer birkaç dizin varsa, bunları birer birer silin, bu komutu tekrar verin)

 git rm -r --cached path-to-those-files 

4. Şimdi karar ver ve bas , bu komutları kullan. Bu, bu dosyaları uzak git'den kaldırır ve git'in bu dosyaları izlemesini durdurmasına neden olur.

 git add . git commit -m "removed unnecessary files from git" git push origin 
3
20 сент. Cevap Shamsul Arefin Sajib 20 Eylül tarafından verildi. 2018-09-20 13:52 '18, 13:52, 2018-09-20 13:52

BFG, Git depolarından büyük dosyalar veya şifreler gibi istenmeyen verileri kaldırmak için özel olarak tasarlanmıştır, bu nedenle herhangi bir büyük tarihi dosyayı kaldıracak basit bir bayrak bulunur (şu andaki değil): "-strip-blobs-more-than"

 $ java -jar bfg.jar --strip-blobs-bigger-than 100M 

Dosyaları ada göre belirtmek istiyorsanız, bunu da yapabilirsiniz:

 $ java -jar bfg.jar --delete-files *.mp4 

BFG Git filtre kolundan 10-1000x daha hızlıdır ve genellikle kullanımı çok daha kolaydır - tüm kullanım talimatlarını ve daha fazla ayrıntı için örnekleri inceleyin.

Kaynak: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html

3
03 сент. Cevap Meir Gerenstadt 03 Eylül 2017-09-03 15:37 '17, 15:37, 2017-09-03 15:37

JonBrave'nin cevabını sevdim, ama düzelten oldukça kirli çalışma dizinlerim var - bir, beni biraz korkutuyor, bu yüzden yaptığım buydu:

git config --global alias.exclude-ignored '! git ls-files -z - işaretlenmiş - exclude-standard | xargs -0 git rm -r - git git ls-dosyalar -z - işaretli - exclude-standart | xargs -0 git stage git stage.gitignore git commit -m "yeni gitignore ve yok sayılan dosyaları dizinden kaldır"

imha:

 git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached git ls-files -z --ignored --exclude-standard | xargs -0 git stage git stage .gitignore git commit -m "new gitignore and remove ignored files from index" 
  • yok sayılan dosyaları dizinden kaldır
  • Stage.gitignore ve az önce sildiğiniz dosyalar.
  • taahhüt etmek
2
08 авг. Cevap Jay Irvine 08 Ağustos tarafından verilmiştir . 2018-08-08 23:49 '18, saat 11:49, 2018-08-08 23:49

CLI'yi kullanmak ve Windows ile çalışmak istemiyorsanız, TortoiseGit kullanmak çok basit bir çözümdür; menüde "Sil (yerel kaydet))" eylemi vardır.

2
15 марта '18 в 14:04 2018-03-15 14:04 Cevap Pedi T. 15 Mart, 18, 02:04 de 2018-03-15 14:04

Bu artık en son gitmede sorun değil (yazı yazarken v2.17.1).

.gitignore izlenen dosyaları yok sayar, ancak silinir. Aşağıdaki betiği çalıştırarak bunu kendiniz doğrulayabilirsiniz. Son git status ifadesi "hiçbir şey yapma" git status .

 # Create empty repo mkdir gitignore-test cd gitignore-test git init # Create a file and commit it echo "hello" > file git add file git commit -m initial # Add the file to gitignore and commit echo "file" > .gitignore git add .gitignore git commit -m gitignore # Remove the file and commit git rm file git commit -m "removed file" # Reintroduce the file and check status. # .gitignore is now respected - status reports "nothing to commit". echo "hello" > file git status 
1
13 июня '18 в 19:21 2018-06-13 19:21 Cevap 13 Haziran’da 13 : 18’de, 19:21

Zaten işlenmiş bir DS_Store :

 find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch 

Görmezden gelin:

 echo ".DS_Store" >> ~/.gitignore_global echo "._.DS_Store" >> ~/.gitignore_global echo "**/.DS_Store" >> ~/.gitignore_global echo "**/._.DS_Store" >> ~/.gitignore_global git config --global core.excludesfile ~/.gitignore_global 

Sonunda bir düzeltme yap!

0
23 апр. Cevap kullanıcı tarafından verilir1818859 23 nisan . 2018-04-23 00:14 '18, 0:14 2018-04-23 00:14

Mac’te:

 $ git --version git version 2.6.4 $ uname -a Darwin MUSRV186016-382 14.5.0 Darwin Kernel Version 14.5.0: Sun Sep 25 22:07:15 PDT 2016; root:xnu-2782.50.9~1/RELEASE_X86_64 x86_64 

1. DS_Store dosyalarını foo dalında git tarafından izlenen dosyalar listesinden silin:

 $ for file in $(git ls-tree -r foo --name-only | grep -i DS_Store); do git rm --cached $file; done 

2. Taahhüt:

 $ git commit -m "Removed .DS_Store files" 

3. Dosyaların artık izlenmediğini kontrol edin.

 $ git ls-tree -r foo --name-only # There should not be anything coming back 

4. Onları konsoldan kaldırmak için tıklayın:

 $ git push 
-5
13 янв. Tarafından cevap Raphvanns 13 Oca 2017-01-13 22:53 '17, 10:53 2017-01-13 22:53

etiketleriyle ilgili diğer sorular