Tek bir dosya hariç tüm dosyalar bir işleme eklensin mi?


571

Bir değişiklik kümesinde bir sürü dosya var, ama özellikle tek bir değiştirilmiş dosyayı yoksaymak istiyorum. Şu şekilde görünüyor git status:

# modified:   main/dontcheckmein.txt
# deleted:    main/plzcheckmein.c
# deleted:    main/plzcheckmein2.c
...

Yapabileceğim bir yol var git addama dokunmak istemediğim tek bir metin dosyasını görmezden mi geliyor? Gibi bir şey:

git add -u -except main/dontcheckmein.txt

Yanıtlar:


851
git add -u
git reset -- main/dontcheckmein.txt

28
tüm klasörü nasıl hariç tutabilirim? - ana veya ana / veya ana / *?
Alan Coromano

8
@MariusKavansky Tüm bu formları kullanabilirsiniz. Eğer kullanırsanız main/*o eklemek gerekir --bir yolu olduğunu git haberdar etmenin önünde. Diğer iki varyant, iki tire eklemeden çalışır. (MsysGit ile Windows 7'de komut isteminde test edilmiştir)
dennisschagt

2
Dışlamak istediğiniz çok sayıda dosya veya başka klasör içeren bazı klasörleriniz varsa: geçici olarak gitignore'nuza ekleyin. git resetdaha sonra bu klasörler için a gerçekleştirmeye devam edilir, ancak büyük klasörlerin eklenmesi uzun sürebilir.
Michael Trouw

2
Yani, tek astar yok mu?
BroVic

5
@Ben Jackson her satıra yorum yapmakta iyi olur, değil mi?
ed1nh0

140

1) Önceden yüklenmiş tek bir dosyadaki değişiklikleri yok saymaya başlamak için

git update-index --assume-unchanged "main/dontcheckmein.txt"

ve bunu geri almak için git update-index --no-assume-unchanged "main/dontcheckmein.txt"

github docs dosyaları yoksay

2) Belirli bir tek dosyayı depoda oluşturulmasını engelleyerek tamamen yoksaymak

İlk olarak şu stackoverflow yayınına bakın: Git global ignore çalışmıyor

'De .gitignore, dosyaya göreceli yolu satır aralığı olmadan ekleyin ./.

Yani, dosya altında olup olmadığını MyProject/MyFolder/myfile.txt(burada, .gitiçinde aynı zamanda MyProjectklasörün) eklemek MyFolder/myfile.txtadresinden Müşteri .gitignoredosyası.

Hangi kuralların yoksay ile ilişkilendirildiğini, git check-ignore "MyFolder/myfile.txt"

Global yoksayma hakkında

Bu bağlantı hakkında konuşur ~/.gitignore_global, ancak dosya projenizle ilgilidir. Eğer koyarsanız Yani, desen dışlamak MyFolder/myfile.txtiçinde ~/.gitignore_global, işe yarayacak ama çok mantıklı olmayacaktır ...

Kurulum ile proje Öte yandan, git config core.excludesfile .gitignorenerede .gitignoreolduğunu MyProject, yerel dosya geçersiz kılar ~/.gitignore_global, olabilir ki çok faydalı kuralları ...

Yani, şimdi, yine de biraz komut dosyası, karıştırmak için yapmak en iyisi .gitignoreile ~/.gitignore_globalen .gitignore.

Son bir uyarı
Yoksaymak istediğiniz dosya zaten depodaysa, bunu yapmadığınız sürece bu yöntem çalışmaz: git rm "MyFolder/myfile.txt"ancak yerel olarak da kaldırılacağı için önce yedekleyin! Daha sonra tekrar kopyalayabilirsiniz ...


5
Sen kullanabilirsiniz git rm --cached MyFolder/myyfile.txtdeposundan dosyayı kaldırmak ancak yerel olarak tutmak için. Help.github.com ilişkin açıklamalar
dennisschagt

87

Dosya için

git add -u
git reset -- main/dontcheckmein.txt

Bir klasör için

git add -u
git reset -- main/*

9
-u neden gereklidir? neden olmasın git add . && git reset -- main/*?

2
-U seçeneği, dizini <pathspec> ile eşleşen bir girdinin bulunduğu yerde günceller. Bu, dizin girdilerini çalışma ağacıyla eşleşecek şekilde değiştirir ve değiştirir, ancak yeni dosya eklemez. -U seçeneği kullanıldığında hiçbir <pathspec> verilmezse, tüm çalışma ağacındaki tüm izlenen dosyalar güncellenir (Güncellemenin geçerli dizin ve alt dizinleriyle sınırlandırılması için Git'in eski sürümleri).
Farhad Mammadli

6
Herkes -u'nun neden git olmayan profesyonellerin anlayacağı dilde gerekli olduğunu açıklayabilir mi?
Patrick

2
-u, itmekte olduğunuz geçerli şubenize referans vermek için kullanılır. Artık bir git push origin mastersonraki push'unuzu yazmanıza gerek yok , sadece git pushve git bunun ana dalda olduğunu bilecek. Umarım yardımcı olur.
Pepeng Hapon

69

Şimdi gitdestekler exclude certain paths and filespathspec sihirle :(exclude)ve kısa formu :!. Böylece aşağıdaki komut olarak kolayca elde edebilirsiniz.

git add --all -- :!main/dontcheckmein.txt
git add -- . :!main/dontcheckmein.txt

Aslında daha fazlasını belirleyebilirsiniz:

git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
git add -- . :!path/to/file1 :!path/to/file2 :!path/to/folder1/*

1
En iyi cevap, teşekkürler! En azından benim durumum için: Sadece bir dosya türünü hariç tutmam gerekiyordu.
Andre Polykanine

15
Bu mükemmel! Linux'ta, :!...kabuğun şikayet etmesini önlemek için hükümleri alıntılamanız gerektiğini unutmayın . Örneğin, So: git add --all -- ':!path/to/file1' ':!path/to/file2' ':!path/to/folder1/*'.
Martin_W

Gibi bir şey var mı :!/path/to/(file1|file2)?
seeker_of_bacon

Bu zsh bir şey ile çarpışır, macOS ve en son git benim için çalışmıyor.
Merlin

1
Birisi bunun resmi olarak belgelendiği yere işaret edebilir mi?
samurai_jane

20

Ben Jackson doğru olsa da, bu çözümü nasıl kullandığımı da ekleyeceğimi düşündüm. Aşağıda (gitadd adını verdiğim) çok basit bir komut dosyası var .gittrackignore.

#!/bin/bash
set -e

git add -A
git reset `cat .gittrackignore`

Ve akımım .gittrackignoreböyle görünüyor.

project.properties

Konuşlandırırken komut satırından derlediğim bir Android projesi üzerinde çalışıyorum. Bu proje SherlockActionBar'a bağlıdır, bu yüzden project.properties'e başvurulmalıdır, ancak bu derleme ile uğraşmaktadır, bu yüzden şimdi sadece gitaddtüm değişiklikleri her defasında project.properties eklentisini eklemek zorunda kalmadan yazıyorum ve git'e ekliyorum.


Yorumuna --kadar ne olduğunu bilmiyordum . Man sayfalarına göre, isteğe bağlıdır ve komutun sonucunu değiştirmez (en azından bu durumda). Bu soru bunu destekliyor gibi görünüyor, stackoverflow.com/questions/17800994/… . Eğer yanılıyorsam beni düzeltin, ama öyle görünüyor ki " --seçenekler / anahtarlar yerine argüman olarak her şeyi tedavi et "
Anthony Naddeo

Güzel kullanımı --içinde git checkoutben bu soruya bakın. Bu değişimimize kadar çifte çizgi ne olduğunu bilmiyordum. git checkoutDallar ve dosyalar arasındaki belirsizliğin bu veya farklı bir şekilde de etkilenip etkilenmeyeceğini merak ediyorum git reset.
Giulio Piancastelli

10

Dosyadaki değişikliği korumak ama taahhüt etmemek için bunu yaptım

git add .

git reset -- main/dontcheckmein.txt

git commit -m "commit message"

dosyanın hariç tutulduğunu doğrulamak için

git status


4

git add -ATüm değiştirilmiş ve yeni eklenen dosyaları bir kerede eklemek için kullanın .

Misal

git add -A
git reset -- main/dontcheckmein.txt



1

Söz konusu özel durum için, en kolay yol .c uzantılı tüm dosyaları eklemek ve diğer her şeyi dışarıda bırakmak olacaktır:

git add *.c

Gönderen git-SCM (veya / ve man git add):

git <pathspec> ekle…

İçerik eklenecek dosyalar. Eşleşen tüm dosyaları eklemek için fileglobs (örn. * .C) verilebilir. <...>

Bunun aşağıdaki gibi bir şey yapabileceğiniz anlamına geldiğini unutmayın:

git add **/main/*

klasördeki tüm dosyaları (yoksayılmayan) eklemek için main. Daha ayrıntılı desenlerle bile çıldırmış olabilirsiniz:

git add **/s?c/*Service*

Yukarıdakiler s(any char)cklasörde Servicebulunan ve dosya adlarında bir yere sahip olan tüm dosyaları ekleyecektir .

Açıkçası, komut başına bir kalıpla sınırlı değilsiniz. Yani git'e .c ve .h uzantılı tüm dosyaları eklemenizi isteyebilirsiniz :

git add *.c *.h

Bu bağlantı size biraz daha küresel desen fikirleri verebilir.

Birçok değişiklik yaparken özellikle yararlı buluyorum, ancak yine de taahhütlerimin o sırada çalışabileceğim bir değişikliklerden ziyade atomik kalmasını ve kademeli süreci yansıtmasını istiyorum. Tabii ki, bir noktada, ayrıntılı desenlerle ortaya çıkmanın maliyeti, daha basit yöntemlerle veya hatta bir seferde bir dosya ile dosya ekleme maliyetinden ağır basar. Ancak, çoğu zaman sadece ihtiyacım olan dosyaları basit bir desenle kolayca belirleyebilir ve diğer her şeyi hariç tutabilirim.

Bu arada, glob kalıplarınızı çalışması için teklif etmeniz gerekebilir , ancak bu benim için hiç böyle olmadı.


0

Biraz kullanıyorum ve aynı dosyalar aracılığıyla her zaman git add --patchvurmaktan kaçınmak için böyle bir şey istedim d. Ben işi bitirmek için git takma adların çok hacky bir çift şanti:

[alias]
    HELPER-CHANGED-FILTERED = "!f() { git status --porcelain | cut -c4- | ( [[ \"$1\" ]] && egrep -v \"$1\" || cat ); }; f"
    ap                      = "!git add --patch -- $(git HELPER-CHANGED-FILTERED 'min.(js|css)$' || echo 'THIS_FILE_PROBABLY_DOESNT_EXIST' )"

Benim durumumda, bazı küçültülmüş dosyaları her zaman yoksaymak istedim, ancak $GIT_EXCLUDE_PATTERNdaha genel bir kullanım durumu gibi bir ortam değişkeni kullanmasını sağlayabilirsiniz .


0

Taahhüt edilecek değişiklikler: (değişmeden "git reset HEAD ..." kullanın)


0

Bunu deneyebilirsiniz: git add * && git reset main/dontcheckmein.txt

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.