Git'i bazı dosyaları yerel olarak yoksaymak için nasıl yapılandırabilirim?


1350

Herkes için global git config'i kirletmeden dosyaları yerel olarak yok sayabilir miyim? Git durumumda spam olan izlenmeyen dosyalara sahibim, ancak yerel şubelerimde bulunan her küçük rasgele izlenmeyen dosya için git yapılandırma değişikliklerini uygulamak istemiyorum.

Yanıtlar:


1862

Gönderen İlgili Git belgelerine :

Belirli bir depoya özgü olan ancak diğer ilgili depolarla paylaşılması gerekmeyen kalıplar (örneğin, havuzun içinde yaşayan ancak bir kullanıcının iş akışına özgü yardımcı dosyalar) $GIT_DIR/info/excludedosyaya girmelidir .

.git/info/excludeDosya herhangi aynı formata sahiptir .gitignoredosyanın. Başka bir seçenek de, core.excludesFileglobal kalıplar içeren bir dosyanın adına ayarlamaktır .

Zaten değiştirilmemiş değişiklikleriniz varsa, yok sayma kalıplarınızı düzenledikten sonra aşağıdakileri çalıştırmanız gerekir:

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

Not$GIT_DIR : Bu, git deposunun yolunu göstermek için git kılavuzunun her yerinde kullanılan bir gösterimdir . Ortam değişkeni ayarlanırsa, hangi repo içinde olduğunuzun konumunu geçersiz kılar, bu muhtemelen istediğiniz şey değildir.


Düzenleme : Başka bir yol kullanmaktır:

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

Şunu tersine çevir:

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

204
Not git update-index --assume-unchanged [<file>...]olarak, hariç tutma dosyasına ekleme yaptıktan sonra çalıştırdığınızdan emin olun . Değişiklikler o zamana kadar alınmayacak.
tollmanz

30
Değişikliklerin git 1.7.9.5 kullanılarak yürürlüğe girmesi için 'git update-index ...' komutunu çalıştırmam gerekmedi.
Jeffrey Martinez

39
Git update-index öğesini yalnızca dosyada önceden bir değişiklik yaptıysanız ve şimdi yoksayılmasını istiyorsanız kullanmanız gerekir. Değişikliği yapmadan önce hariç tutmayı değiştirirseniz, bu gerekli değildir.
Brady Emerson

13
Bu, yok sayılan dosyaların aksine .gitignore gibi işlemler sırasında dosyanın değiştirildiği gibi görünmesini engellerken, git reset --hard komutunu çalıştırırsanız dosyalar yine de repo sürümüne sıfırlanır.
Brady Emerson

19
Başına stackoverflow.com/questions/23097368/... ve stackoverflow.com/questions/13630849/... , skip-worktreemuhtemelen tercih edilecektir assume-unchanged.
danShumway

436

Güncelleme : git update-index --skip-worktree [<file>...]Bunun yerine kullanmayı düşünün , teşekkürler @danShumway! Borealid'in iki seçeneğin farkı hakkında açıklamasına bakınız .


Eski cevap:

İzlenen dosyalarda yerel değişiklikleri yoksaymanız gerekiyorsa (dosyaları yapılandırmak için yerel değişikliklere sahibiz) kullanın git update-index --assume-unchanged [<file>...].


8
Sadece not etmek için, $ GIT_DIR / info / exclude dosyasına (örneğin, benim-file.php) bir dosya ekledim ve sonra yok sayılmaya git update-index --assume-unchanged my-file.phpbaşlaması için çalıştırmak zorunda kaldım . Bahşiş için teşekkürler!
tollmanz

78
Geri almak için: git update-index --no-assume-unchanged my-file.php
Ray

18
Sadece açıklama için: değişmeyen varsayalım izlenen dosyalar için (repo var) ... OP İzlenmemiş dosyaları istiyordu, bu durumda .git/info/excludene istediğinizi (sık paylaşılan ve izlenen .gitignore kirletmekten kaçınmak için)
dyodji

7
Stackoverflow.com/questions/23097368/… 'a göre bu güvenli değildir ve dikkatli değilseniz dosyalarınız yine de işlenebilir. Bu soruna kusursuz bir çözüm olarak değil, bir performans yardımı olarak tasarlanmıştır.
danShumway

3
Güncellemenizi--assume-unchanged okumadan önce acele ettim . Birlikte undid ve daha sonra yaptığı açık olarak ... Am I? --no-assume-unchanged--skip-worktree
Nicolas Miari

162

Aşağıdaki satırları .gitconfig dosyanızın [takma ad] bölümüne ekleyin

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

Artık git ignore my_fileyerel dosyadaki değişiklikleri yoksaymak ve değişiklikleri yok saymak için kullanabilirsiniz git unignore my_file. git ignoredyok sayılan dosyaları listeler.

Bu cevap http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html adresinden alınmıştır .


1
"! git ls-files -v | grep" ^ [[: lower:]] "- Bunu windows
cmd'de

3
Gerçek bir kabuk yükleyin (örneğin Babun bash veya zsh sağlar); Duygularınızı biliyorum, ama son zamanlarda Windows'tan Linux'a geçtim ve bir daha asla cmd kullanmam.
Xerus

@Haohmaru, her zaman WSL'yi (Linux için Windows Alt Sistemi) kullanabilirsiniz.
A Sz

110

Birkaç seçeneğiniz var:

  • .gitignoreÇalışma dizininizde kirli (veya taahhüt edilmemiş) bir dosya bırakın (veya topgit veya başka bir yama aracını kullanarak otomatik olarak uygulayın ).
  • $GIT_DIR/info/excludeBir ağaca özelse, hariç tutmaları dosyanıza koyun .
  • Çalıştırın git config --global core.excludesfile ~/.gitignoreve desen ekleyin ~/.gitignore. Bu seçenek, tüm ağaçlardaki belirli desenleri yok saymak istiyorsanız geçerlidir . Ben bu kullanmak .pycve .pyoörneğin dosyaları.

Ayrıca, varsa desen kullandığınızdan ve dosyaları açıkça numaralandırmadığınızdan emin olun.


10
git config --globalSeçeneği global olarak ayarlamanız gerektiğini düşünüyorum .
Josh Lee

7
Aslında .gitignore 'u .gitignore;)' ye ekleyin!
Dominik George

68

Bence aradığınız:

git update-index --skip-worktree FILENAME

yerel olarak yapılan değişiklikleri yok sayar

İşte http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ bu çözüm hakkında daha fazla açıklama!

kullanımı geri almak için:

git update-index --no-skip-worktree FILENAME

9
Arasında ilgili tartışma vardır --skip-worktreeve --assume-unchangeden bu SO soru
Merwer

1
Bunu nasıl geri alabilirim veya şu anda yoksayılan dosyaların / kalıpların listesini görebilirim, --skipworktreedaha sonra fikrimi değiştirmeli ve dosyayı tekrar izlemeye başlamak ister miyim?
Anomali

1
nasıl geri alınır?
user1735921

3
Geri almak için lütfen kullanıngit update-index --no-skip-worktree <file>
user1735921

49

Bu işlemi daha basit hale getirmek için bazı git takma adları yükleyebilirsiniz . Bu [alias], .gitconfigdosyanızın düğümünü düzenler .

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

Bunun sizin için yüklediği kısayollar aşağıdaki gibidir:

  • git ignore config.xml
    • git, üzerinde herhangi bir değişiklik görmüyormuş gibi yapar config.xml- yanlışlıkla bu değişiklikleri yapmanıza engel olur.
  • git unignore config.xml
    • git, yaptığınız değişiklikleri kabul etmeye devam eder config.xml- bu değişiklikleri tekrar uygulamanızı sağlar.
  • git ignored
    • git "yoksaydığınız" tüm dosyaları yukarıda açıklanan şekilde listeler.

Bunları , aynı versiyonunu sunan phatmann'ın cevabına değinerek yaptım--assume-unchanged .

Sunduğum sürüm --skip-worktreeyerel değişiklikleri yok saymak için kullanıyor . Farkın tam bir açıklaması için Borealid'in cevabına bakın , ancak esasen --skip-worktreeamaç geliştiricilerin değişikliklerini yapma riski olmadan dosyaları değiştirmesidir .

git ignoredKomut Burada sunulan kullanır git ls-files -vve ile başlayan sadece bu girdileri göstermek için listeyi filtreler Setiketi. SEtiketi olan durumu "worktree atlamak" Dosya belirtir. İle gösterilen dosya durumlarının tam listesi için git ls-files: -tseçeneğinin belgelerine bakın git ls-files.


1
Bu izlenmeyen dosyalar için çalışmaz: <(git 2.13.5 osx üzerinde)
Terra Ashley

'!' olması gerekiyordu '!git ls-files -v | grep "^S"'? Komut benim için orada çalışmıyor .. ve kaldırıldı ile iyi çalışıyor gibi görünüyor.
Tiris

git takma adındaki ünlem işareti, git'e git alt komutundan ziyade harici bir komut çalıştırmasını söyler . Bir kabuk boru hattına ihtiyacım olduğu için koydum, bu yüzden dışarıdan git'i çağırmam gerekiyor. Sadece (sizin tavsiye başı gibi) ünlem işareti kaldırarak çalıştı, ancak bunu yapmaz değil benim için çalış. Anladım . Bu mantıklı; ünlem işareti olmadan: git komutunu takma isimlendirir . Expansion of alias 'ignored' failed; 'git' is not a git commandgit git ls-files …
Birchlabs

Açıklama için teşekkürler. Git takma adını bilmiyorum ve sadece takma ad yapmadan önce test etmek için bir kabukta çalışıyordum.
Tiris

Bu harika bir çözüm. Git dizin başına izlediğinden, yukarıdaki diğer adı çalıştırdığınızda, git ignore <filename>yalnızca bu dizin için geçerlidir. Ve sonunda bu dosyada değişikliklerinizi yapmak ve uzaktan kumandaya geçmek istediğinizde git unignore <filename>, geçici olarak tekrar izlemeye başlamak için kullanışlı olanı kullanın! Teşekkürler!
nickang

42

Ana dizininize bir .gitignore dosyası ekleyebilirsiniz, yani $HOME/.gitignoreveya ~/.gitignore. Ardından git'e şu dosyayı komutla kullanmasını söyleyin:

git config --global core.excludesfile ~/.gitignore

Bu, göz ardı edilecek öğeye karar verirken başvuruda bulunan normal bir .gitignore dosyasıdır. Ana dizininizde bulunduğundan, yalnızca sizin için geçerlidir ve herhangi bir proje .gitignore dosyasını kirletmez.

Bu yaklaşımı yıllardır harika sonuçlarla kullanıyorum.


Teşekkürler, @EricChen. Answerwer'ı güncelledim; bunu deneyin ve ardından git check-ignore <file-name>doğrulamak için kullanın . LMK sizin için çalışıyorsa
JESii

Sadece benim için çalıştı =:git config --global core.excludesfile ~/.gitignore
E. Sundin

.gitignoreAna dizinin altına bir dosya koydum ve git yerine bu dosyayı kullanmasını söyledim, sonra yerel olarak kaldırmak istediğim dosyaları sildim. Ancak, değişiklikleri ittikten sonra uzak depo bu dosyaları da sildi. Ben yanlış bir şey mi yaptım?
zyy

Vay, @xyz; .gitignore, yerel dizininizdeki dosyaları yok saymakla ilgilidir. Yapmanız gereken şey, git rm --cachedonları depodan kaldıran, ancak onları yerelde bırakan şey. Bu taahhüdü git reset --soft HEAD^geri almak ve dosyalarınızı kurtarmak gibi bir şeyle önceki taahhüdünüze geri dönebilmeniz gerekir . Git'in güzelliği bu: Git tarihinizde hala hepsi var.
JESii

2

İzlenmeyen dosyaları, özellikle izlenmeyen (birkaç) klasörde bulunuyorsa, yoksaymak için basit bir çözüm, .gitignoreizlenmeyen her klasöre bir dosya eklemek ve *ardından yeni bir satır içeren tek bir satıra girmektir . İzlenmeyen dosyalar birkaç klasördeyse gerçekten basit ve anlaşılır bir çözümdür. Benim için, tüm dosyalar tek bir izlenmemiş klasörden geliyordu vendorve yukarıdakiler işe yaradı.


1
Harika! Bilginize: Bu sadece git'in klasörleri değil dosyaları izlemesi (ve işlemenize izin vermesi) nedeniyle çalışır.
jmiserez

-2

Reponuzda zaten bir .gitignore dosyası yoksa, basit bir çözüm bir .gitignore dosyası oluşturmaktır ve içinde .gitignoreyok sayılacak dosyalar listesine eklenir .


4
Peki ya ekip daha sonra bir gidignore eklemek için eklemek isterse? Bu işe yarıyor mu? Kulağa korkunç bir fikir ve işe yaramayacak bir şey gibi geliyor.
Bjorn

Bu adamın cevabı beni kırdı. Bunu kimse yapamaz.
Martyn Chamberlin

Bu, koyacağınız bir yer olduğu sürece hızlı ve basit bir çözümdür. Repomuzun .gitignoreüstünde paylaşılan bir dosya var. Ama kirli dosyalarım derin bir klasörde, bu yüzden .gitignoreonların yanına kendim ekledim +1
joeytwiddle
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.