Soru Git, izlenen, ancak şu anda .gitignore'da bulunan bir dosya hakkında “unut” nasıl yapılır?


Tarafından izlenen bir dosya var. gitama şimdi dosya .gitignore liste.

Ancak, bu dosyada görünmeye devam ediyor git status düzenlendikten sonra. Nasıl zorlarsın git bunu tamamen unutmak mı?


3665
2017-08-13 19:23


Menşei


git clean -X benzer geliyor, ancak bu durumda geçerli değil (dosyalar hala Git tarafından izleniyorken). Yanlış rotayı takip etmemek için bir çözüm arayan herkes için bunu yazıyorum. - imz -- Ivan Zakharyaschev
Bunun tek gerçek cevabı aşağıda, bkz. git update-index --assume-unchanged. Bu çözüm 1) dosyayı sunucuda (dizin) tutar, 2) yerel olarak serbestçe değiştirmenizi sağlar. - Qwerty
Kullanmalısın --skip-worktree, görmek: stackoverflow.com/questions/13630849/... - Doppelganger
Önemli bir soru şudur: dosya depoda kalmalı mı, değil mi? Örneğin, yeni bir kişi repoyu klonlarsa, dosyayı almalı mı, almasınlar mı? Eğer EVET sonra git update-index --assume-unchanged <file> doğru ve dosya depoda kalacak ve değişiklikler eklenmeyecek git add. Eğer YOK HAYIR (örneğin, bazı önbellek dosyası, oluşturulan dosya vb.) git rm --cached <file> depodan kaldıracaktır. - Martin
@Mwill @Qwerty Everyon, tavsiyede bulunmaktan vazgeçmeli --assume-unchanged büyük izlenen dosyaların durumunu kontrol etmesini engelleyen performans için tercih edilen --skip-worktree kullanıcının artık işlemek istemediği değiştirilmiş izlenen dosyalar içindir. Görmek stackoverflow.com/questions/13630849/... - Philippe


Cevaplar:


.gitignore izlenmeyen dosyaların eklenmesini engeller ( add -f) git tarafından izlenen dosyaların kümesine, ancak git zaten izlenen herhangi bir dosyayı izlemeye devam edecektir.

Bir dosyayı izlemeyi durdurmak için dizinden kaldırmanız gerekir. Bu, bu komutla sağlanabilir.

git rm --cached <file>

Dosyanın baştan revizyondan kaldırılması bir sonraki taahhütte gerçekleşecektir.


3887
2017-08-13 20:40



Benim için işe yarayan süreç 1. beklemede olan değişiklikler oldu. 2. git rm --cacheed <dosya> ve tekrar işleyin. 3. dosyayı .gitignore'a ekleyin, git status ile kontrol edin ve tekrar işleyin - mataal
Çok önemli eklemeler. Göz ardı edilen dosya değiştirilecekse (ancak buna rağmen yapılmamalı), değiştirdikten ve yürüttükten sonra git add . endekse eklenecektir. Ve bir sonraki işlem onu ​​depoya yapardı. Bundan kaçınmak için, o mataal bir şey daha söyledi: git update-index --assume-unchanged <path&filename> - Dao
@AkiraYamamoto'nun yöntemi benim için de iyi çalıştı. Benim durumumda, depomuzda binlerce dosya bulunduğundan çıktıyı bastırdım: git rm -r -q --cached . - Aaron Blenkush
Bu, dosyayı siler git pull gerçi. - Petr Peller
git rm --cacheed <dosya> sadece dosyayı depodan kaldır, git update-index --assume-değiştirilmemiş <dosya> gösterilmeyen dosyada kaydedilen değişiklikler gösterilmez ve yeni bir değişiklik yapmaz. Ama ben GTI JUST IGNORE DOSYASI DOSYASI İÇERİĞİNİ istiyorum - Igor Semin


Aşağıdaki komut dizileri Git dizinindeki tüm öğeleri (çalışma dizininden veya yerel repodan değil) kaldıracak ve git Sayısını göz ardı ederek git dizisini güncelleyecektir. PS. Dizin = Önbellek

İlk:

git rm -r --cached . 
git add .

Sonra:

git commit -am "Remove ignored files"

1997
2017-09-30 13:51



Bu cevap ile kabul edilen arasındaki farkı vurgulamak için: Bu komutları kullanarak, etkilenen dosyaları gerçekten bilmeniz gerekmez. (Endekste silinmesi gereken çok sayıda rasgele dosya ile geçici bir direk düşünün). - Ludwig
Kabul edilen cevapla aynı. Dosyalar silinecek git pull. - Petr Peller
Bunu standart git komutu olarak kullanmak güzel olurdu. Gibi bir şey git rmignored. - Berik
@gudthing -r "özyineli" anlamına gelir - Monkey King
Bununla birlikte ekleyerek sona erebilir diğer şu anda kullanılmayan işe yaramaz dosyalar .gitignore. Ne kadar gürültüye bağlı olduğunuzu anlamak zor olabilir. git status bu komuttan sonra. Bir komut sadece kaldırır Yeni göz ardı edilen dosyalar daha iyi olurdu. Bu yüzden tercih ederim thSoft'un cevabı - KurzedMetal


git update-index benim için iş yapar:

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

Not: Bu çözüm aslında bağımsız .gitignore gitignore sadece takip edilmemiş dosyalar içindir.

Düzenle: Bu cevap gönderildiği için yeni bir seçenek oluşturuldu ve bu tercih edilmeli. Kullanmalısın --skip-worktree Kullanıcının artık işlemek istemediği ve tutulduğu değiştirilmiş izlenen dosyalar içindir --assume-unchanged büyük izlenen dosyaların durumunu kontrol etmesini önlemek için performans için. Görmek https://stackoverflow.com/a/13631525/717372 daha fazla ayrıntı için...


740
2017-11-27 11:24



Bu IS gerçek cevap. Başar gerçekten, çok basit, kirletmez git status ve aslında çok sezgisel. Teşekkürler. - Pablo Olmos de Aguilera C.
Yeterince iyiye gittim rm [...] . çözüm, en azından nasıl çalıştığını grok edebilirdi. Ne hakkında harika bir belge bulunamadı. update-index & --assume-unchanged yap. Bunun nasıl göründüğünü ekleyebildiğim, göz ardı edilen tüm dosyaları kaldırmak istediğim için? (Ya da açıklamak için bir bağlantı?) - Brady Trainor
git update-index --assume-unchanged <path> … gitmeden bağımsız olarak, belirtilen yoldaki değişikliklerin yok sayılmasına neden olur. .gitignore. Bir uzaktan kumandayı çektiğinizde ve bu kumandanın bu yolla ilgili değişiklikleri varsa, git bir çakışma ile birleşmeyi başaramaz ve el ile birleştirmeniz gerekir. git rm --cached <path> … git, bu yolu izlemeyi durdurur. Yolu eklemezseniz .gitignore Gelecekte yolu göreceksin git status. İlk seçenek git taahhüt tarihinde daha az gürültü içeriyor ve gelecekte "dağıtılmış" dosyada değişiklik yapılmasına izin veriyor. - ManicDee
Kullanarak geri al: git update-index --no-assume-değiştirilmedi <dosya> - xgMz
Bunun kabul edilen cevap olmadığı konusunda kafam karıştı. Burada kabul edilen cevap açıkça sorulan asıl soruyu cevaplamıyor. Bu yanıt, depodaki kaldırmadan depodaki dosyadaki değişiklikleri yok sayar. - Dave Cooper


git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

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


218
2018-05-23 22:29



Onları çalışma dizininden de çıkarmanız gerekirse, git ls-files --ignored --exclude-standard | xargs git rm . Bu cevabın en iyisi olduğuna inanıyorum! Çünkü çok açık, Unix yönlü ve istediği şeyi doğrudan, diğer, daha karmaşık komutların yan etkilerini oluşturmadan yapar. - imz -- Ivan Zakharyaschev
Mükemmel cevap; ancak, ortadaki boşluklara sahip yollarınız varsa, komut başarısız olur, örn .: "Dir / my_ignored_file.txt" - David Hernandez
git ls dosyaları --ignored --exclude-standard | sed 's /.*/"&"/' | xargs git rm --cached - David Hernandez
git rm şikayet ederse ls-files hiçbir şeyle eşleşmedi. kullanım xargs -r git rm ... söylemek xargs koşmamak git rm hiçbir dosya eşleşmezse. - Wolfgang
Ayırıcı olarak \ 0 kullanılması daha iyi olur: git ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached - Nils-o-mat


Bu komutu, programlanmamış dosyaları kaldırmak için her zaman kullanırım. Tek satır, Unix tarzı, temiz çıktı:

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

Tüm göz ardı edilen dosyaları listeler, içindeki boşlukları içeren yolları işlemek için her çıktı satırını tırnak işareti ile değiştirin ve her şeyi git rm -r --cached dizinden yolları / dosyaları / dizinleri kaldırmak için.


60
2018-06-19 15:42



Harika çözüm! Mükemmel bir şekilde çalıştı ve tüm dosyaları kaldırdıktan sonra tekrar ekleyerek daha doğru bir karar verdi. - Jon Catmull
Ben de bunu "en temiz" buldum. Açık olabilir, ama sadece ilk kısmı koşuyor, git ls-files --ignored --exclude-standard, kendi başına yeni hangi dosyaları yeni anladığınızı / doğruladığınızı .gitignore devam etmeden ve finali yürütmeden önce hariç tut / kaldır git rm. - JonBrave
Dikkat edin, dosya adlarında, bunlarda belirli "kötü" karakterlerle başarısız olur, ör. \n. Bunun için çözüm önerimi gönderdim. - JonBrave
Başka bir uyarı: çekmede, bu dosyanın başkalarının çalışma dizinlerinde silinmesine neden olur, değil mi? - LarsH


Eğer yapamazsan git rm izlenen bir dosya çünkü diğer insanlar buna ihtiyaç duyabilir sen  git rm --cachedBaşka biri bu değişikliği aldığında, dosyaları dosya sisteminden silinecektir. https://gist.github.com/1423106 insanlar sorun etrafında çalıştı.


49
2017-07-19 00:08



Git, silme sırasında kirliyse dosyayı kaldırmaz. Ve kirli değilse, dosyayı almak kadar kolay olurdu git checkout <oldref> -- <filename> - ama sonra kontrol ve göz ardı edildi. - amenthes
Bu teorik olarak soruyu cevaplayabilirken, tercih edilirdi Burada cevabın önemli kısımlarını dahil etmek ve referans için bağlantıyı sağlamak. Görmek İşte talimatlar nasıl yazılır daha iyi "bağlantıya dayalı" yanıtlar. Teşekkürler! - GhostCat
Sadece söylüyorum. 5 yaşındaki cevap ve 45 oy, ama kimse "sadece cevaplar kötü?" Demeye cesaret edemez. - GhostCat


harekete geç, işte ol, sonra geri taşı. Bu benim için geçmişte çalıştı. Bunu başarmak için muhtemelen 'gittikçe' bir yol var.


44
2017-08-13 19:27



Önceden yok sayılmayan bir sürü dosyayı görmezden gelmek istiyorsanız bu harika çalıştı. Dediğin gibi, muhtemelen bunun için daha iyi bir yol var. - Oskar Persson
Tam olarak yaptığım bu. Dosyaları, git'in dışındaki bir klasöre taşıyın, sonra "git add.", "Git commit" komutunu kullanın. (Bu dosyalar kaldırıldı) daha sonra gitignore ekleyin, dosyalara / klasörlere bakın, gitignore dosyasını git'e tekrar ekleyin, daha sonra klasörlere kopyalayın / taşıyın ve göz ardı edilmelidir. Not: dosyaların GIT'den silindiği görünecektir, bu nedenle yukarıdaki çözümlerde belirtildiği gibi onları muhtemelen diğer checkouts / pull'lardan kaldıracaktır, ancak başlangıçta bunların kopyalarını oluşturduğunuzdan, bu bir IMHO sorunu kadar değildir. Sadece ekibin geri kalanının bilmesini sağla ... - Del
Yanlış yazılmış klasörlerden kurtulmanın en kolay yolu budur. - Martlark
Görebildiğim tek yol gibi görünüyor. Gitgide büyük bir hata ('özellik' değil), bir dosya / klasöre .gitignore ekledikten sonra, sadece bu noktadan - sonsuza dek - her yerde bu dosyayı görmezden gelmiyor. - JosephK


Benim için çalışmadı ne

(Linux’un altında), buradaki mesajları önermek istedim. ls-files --ignored --exclude-standard | xargs git rm -r --cached yaklaşım. Ancak, (bazı) kaldırılacak dosyaların gömülü bir yeni satır / LF /\n onların isimleriyle. Çözümlerden ikisi de:

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 (dosya bulunamadı hataları hakkında).

Ben teklif ederim

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

Bu kullanır -z argüman ls-files, ve -0 argüman xargs Dosya isimleri "kötü" karakterler için güvenli / doğru yiyecek ve içecek sağlamak için.

El kitabında git-ls-files (1), belirtir:

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

Bu yüzden, dosya isimlerinde bu karakterlerden herhangi biri varsa, çözümümün gerekli olduğunu düşünüyorum.

DÜZENLEME: Bunu eklemek istedim --- git rm komut --- bu bir takip edilmeli işlemek taşınmaların kalıcı hale getirilmesi, ör. git commit -am "Remove ignored files".


37
2017-12-29 12:50



Benim için bu en iyi çözüm. Birinden çok daha iyi bir performansa sahiptir. git add .. Ayrıca yukarıdaki bazı yorumlardaki en iyi gelişmeleri içerir. - Nils-o-mat
Harika çözüm ve çok iyi çalışıyor - smac89
Bir işe yaradı - kaldırılmış dosyaları boşluklarla doğru olarak isimlendirdi. - Dave Walker
ThSoft ekleyebilir misiniz git commit -am "Remove ignored files" cevabınızdan sonra? Cevaplarınız bana bir şeyler yolladı: j - kando