Kabul edilen cevap Git'i bir dosya hakkında "unutturmaz" ... (tarihsel olarak). Bu sadece git'in şimdiki / gelecekteki dosyayı yoksaymasını sağlar .
Bu yöntem markaları git'e unutmak tamamen göz ardı dosyaları ( geçmiş / bugün / gelecek), ancak does not (uzaktan gelen yeniden çekti bile) çalışma dizinden silme şey.
Bu yöntem /.git/info/exclude
(tercih edilen) VEYA bir önceden varolan .gitignore
içinde tüm dosyaları var kaydedilmesini unutulmuş / göz ardı edilecek.1
Git'in uygulanmasına yönelik tüm yöntemler, gerçekte etkili bir şekilde yeniden yazma geçmişinden sonra davranışı görmezden gelir ve bu nedenle, bu işlemden sonra çekilebilecek herhangi bir kamu / paylaşılan / işbirlikçi depo için önemli sonuçlar doğurur. 2
Genel tavsiye: temiz bir repo ile başlayın - her şey yapıldı, çalışma dizininde veya dizinde bekleyen hiçbir şey yok ve bir yedek alın !
Ayrıca, yorum / düzeltme geçmişi içinde bu cevabı ( ve düzeltme geçmişi arasında bu soruya ) aydınlatarak / faydalı olabilir.
#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"
#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached
#Commit to prevent working directory data loss!
#this commit will be automatically deleted by the --prune-empty flag in the following command
#this command must be run on each branch
git commit -m "ignored index"
#Apply standard git ignore behavior RETROACTIVELY to all commits from all branches (--all)
#This step WILL delete ignored files from working directory UNLESS they have been dereferenced from the index by the commit above
#This step will also delete any "empty" commits. If deliberate "empty" commits should be kept, remove --prune-empty and instead run git reset HEAD^ immediately after this command
git filter-branch --tree-filter 'git ls-files -z --ignored --exclude-standard | xargs -0 git rm -f --ignore-unmatch' --prune-empty --tag-name-filter cat -- --all
#List all still-existing files that are now ignored properly
#if this command returns nothing, it's time to restore from backup and start over
#this command must be run on each branch
git ls-files --other --ignored --exclude-standard
Son olarak, bu GitHub kılavuzunun geri kalanını izleyin (6. adımdan başlayarak) komutlarla ilgili önemli uyarıları / bilgileri içeren .
git push origin --force --all
git push origin --force --tags
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
Şimdi değiştirilmiş uzak repodan gelen diğer geliştiriciler bir yedek oluşturmalı ve sonra:
#fetch modified remote
git fetch --all
#"Pull" changes WITHOUT deleting newly-ignored files from working directory
#This will overwrite local tracked files with remote - ensure any local modifications are backed-up/stashed
git reset FETCH_HEAD
Dipnotlar
1 Çünkü /.git/info/exclude
belki de yukarıdaki talimatları kullanarak tüm tarihi kaydedilmesini uygulanan alma hakkında ayrıntılı bilgi alınabilir .gitignore
dosyası içine tarihsel bunun bu yanıt kapsamı dışındadır gerek (ler) işlemek. Yaptığım .gitignore
ilk şeymiş gibi kök salmış olmak istedim . Diğerleri umursamayabilir, çünkü taahhüt tarihinde var olan /.git/info/exclude
yere bakılmaksızın aynı şeyi başarabilir ve sonuçların farkında olsa bile .gitignore
tarihin açıkça yeniden yazılması çok hassas bir konudur .
FWIW, potansiyel yöntemler, bu sorunun cevapları gibi her bir taahhüde haricigit rebase
bir git filter-branch
kopya içerebilir .gitignore
2 Git git rm --cached
komutunun, aslında bağımsız bir komutun sonuçlarını uygulayarak yoksayma davranışını zorlamak, zorla itilen uzaktan kumandanın gelecekteki çekmelerinde yeni yok sayılan dosya silinmesine neden olabilir . Aşağıdaki --prune-empty
komuttaki bayrak, git filter-branch
yalnızca "tüm yok sayılan dosyaları sil" dizinine yalnızca otomatik olarak kaldırarak bu sorunu önler. Git tarihinin yeniden yazılması , kamusal / paylaşılan / işbirlikçi depolardan gelecekteki çekimlere zarar verecek olan karma karmaları da değiştirir . Lütfen böyle bir repoya yapmadan önce sonuçları tam olarak anlayın . Bu GitHub kılavuzu aşağıdakileri belirtir:
Ortak çalışanlarınıza yeniden pazarlamasını söyleyin , değil birleştirme, bunlar eski (kusurlu) depo tarihin kapalı oluşturulan herhangi dalları. Bir birleştirme taahhüdü, tasfiye etme sorununa gittiğiniz lekeli tarihin bir kısmını veya tamamını yeniden başlatabilir.
Alternatif çözümler yok uzak repo etkileyecek olan git update-index --assume-unchanged </path/file>
veya git update-index --skip-worktree <file>
örnekleri bulunabilir, burada .
git clean -X
kulağa benzer geliyor, ancak bu durumda geçerli değil (dosyalar hala Git tarafından izlenirken). Bunu yanlış yolu takip etmemek için çözüm arayan herkes için yazıyorum.