Bir dosyayı 'git' yapabilir ve içerik değişikliklerini yoksayabilir miyim?


355

Ekibimdeki her geliştiricinin kendi yerel yapılandırması var. Bu yapılandırma bilgileri, devtargets.rbkomisyon oluşturma görevlerimizde kullanılan adlı bir dosyada saklanır . Yine de geliştiricilerin birbirlerinin devtargets dosyasını tıkamasını istemiyorum.

İlk düşüncem bu dosyayı .gitignorelisteye koymaktı, böylece gitmeye kararlı değil.

Sonra merak etmeye başladım: dosyayı yürütmek mümkün mü, ancak dosyadaki değişiklikleri göz ardı etmek mi? Bu nedenle, dosyanın varsayılan bir sürümünü uygularım ve ardından bir geliştirici yerel makinelerinde değiştirdiğinde, git değişiklikleri yoksayar ve git durumu veya git kesinleştirdiğinizde değiştirilen dosyalar listesinde görünmez .

Mümkün mü? Kesinlikle güzel bir özellik olurdu ...


1
Ayrıca bkz stackoverflow.com/questions/3318043/... benzer bir konuyu üzerinde.
VonC


Yanıtlar:


459

Tabii, zaman zaman bunu tam olarak yapıyorum

git update-index --assume-unchanged [<file> ...]

Geri almak ve tekrar izlemeye başlamak için (hangi dosyaların izlenmediğini unuttuysanız, bu soruya bakın ):

git update-index --no-assume-unchanged [<file> ...]

İlgili belgeler :

- [no-] varsay-değişmedi
Bu bayrak belirtildiğinde, yollar için kaydedilen nesne adları güncellenmez. Bunun yerine, bu seçenek yollar için "değişmediğini varsay" bitini ayarlar / kaldırır. "Değişmediğini varsay" biti açık olduğunda, kullanıcı dosyayı değiştirmeyeceğine söz verir ve Git'in çalışma ağacı dosyasının dizine kaydedilenle eşleştiğini varsaymasına izin verir. Çalışma ağacı dosyasını değiştirmek istiyorsanız, Git'e söylemek için bitin ayarını kaldırmanız gerekir. Bu, bazen çok yavaş lstat(2)sistem çağrısı (örn. Cif'ler) olan bir dosya sisteminde büyük bir projeyle çalışırken yardımcı olur .

Git, dizinde bu dosyayı değiştirmeniz gerektiğinde başarısız olur (incelikle); bu nedenle, varsayılan izlenmemiş dosyanın yukarı yönde değiştirilmesi durumunda, durumu manuel olarak ele almanız gerekir.

Bu durumda zarif bir şekilde başarısız olunması, bir çekme işlemi yaptığınızda o dosyanın akışında herhangi bir değişiklik (yasal değişiklikler vb.) Varsa, şunu söyleyecektir:

$ git pull
…
From https://github.com/x/y
   72a914a..106a261  master     -> origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
                filename.ext

ve birleşmeyi reddeder.

Bu noktada, yerel değişikliklerinizi geri alarak bunun üstesinden gelebilirsiniz, işte bir yol:

 $ git checkout filename.ext

daha sonra tekrar çekin ve yerel dosyanızı yeniden değiştirin veya ayarlayabilir –no-assume-unchangedve bu noktada normal saklama ve birleştirme vb. yapabilirsiniz.


10
Bu komut .git klasöründe yerel olarak bir şey yapar mı? Yani, bir config.php dosyası için bu komutu çalıştırırsam, bu repo kullanan diğer kullanıcılara yayılacak mı?
Magus

16
@Magus: Hayır. Bu sadece sizin için çalışacaktır.
Rob Wilkerson

3
Ve yakında daha sonra bir dosyanın değişmediğini nasıl belirleyeceğinizi bilmek isteyeceksiniz: stackoverflow.com/questions/2363197/…
Ciro Santilli: 冠状 病 六四 事件 法轮功 20:15

10
"Git stash" kullanıldığında bu şekilde yok sayılan dosyalarda yapılan değişiklikler kaybolur. Bunun bir yolu var mı?
Alexis

5
Bunun için bu değil git update-index --assume-unchanged. public-inbox.org/git/…
jsageryd

97

Bunu yapmanın tercih edilen yolu , bu cevaptagit update-index --skip-worktree <file> açıklandığı gibi kullanmaktır :

assume-unchangedbir grup dosyanın değiştirilip değiştirilmediğini kontrol etmenin pahalı olduğu durumlar için tasarlanmıştır; biti ayarladığınızda git (elbette) dizinin o kısmına karşılık gelen dosyaların çalışma kopyasında değiştirilmediğini varsayar. Böylece stat çağrılarının karışıklığını önler. Bu bit, dosyanın dizine girişi her değiştiğinde kaybolur (bu nedenle, dosya akış yukarı değiştiğinde).

skip-worktreebundan daha fazlasıdır: git dosyanın değiştirildiğini (veya bir sıfırlama -hard veya benzeri ile değiştirilmesi gerektiğini) bile bilse bile, bunun yerine dizinden sürümü kullanmıyormuş gibi davranacaktır. Dizin atılana kadar bu devam eder.

Bunu geri almak için şunu kullanın: git update-index --no-skip-worktree <file>

Git 2.25.1 sürümünden bu yana, bu da şu şekilde önerilmektedir:

Kullanıcılar, Git'e izlenen dosyalarda yapılan değişiklikleri yok saymasını bildirmek için genellikle varsayım değiştirilmemiş ve atlama-çalışma ağacı bitlerini kullanmaya çalışırlar. Git beklendiği gibi çalışmaz, çünkü Git yine de belirli işlemleri gerçekleştirirken çalışma ağacı dosyalarını dizine göre kontrol edebilir. Genel olarak Git, izlenen dosyalarda yapılan değişiklikleri yok saymanın bir yolunu sunmaz, bu nedenle alternatif çözümler önerilir.

Örneğin, değiştirmek istediğiniz dosya bir çeşit yapılandırma dosyasıysa, havuz daha sonra yok sayılan ada kopyalanıp değiştirilebilen örnek bir yapılandırma dosyası içerebilir. Depo, örnek dosyayı şablon olarak işlemek, otomatik olarak değiştirmek ve kopyalamak için bir komut dosyası da içerebilir.


Bu, depoya ödeme yapan tüm kullanıcılar için çalışıyor mu? Belli dosyaları alacaklar ama açıkça belirtilmedikçe artık yanlışlıkla değişiklik ekleyemeyecekler mi?
mmm

2
@momomo bayrak dizinde saklanır böylece hayır, sadece tek bir kullanıcı içindir. Tüm kullanıcılarda çalışan bir şey için erjiang'ın cevabına bakın .
1615903

Dosyanın içeriğinin ne olması gerektiğini anlamaya çalışıyorum. Bahsettiğiniz cevaba yorum yaptım, ama cevap alamadım. Nerede bulunması gerekiyor ve içeriği nedir? Biliyor musun?
mmm

Takip etmiyorum. Komut, komutta belirttiğiniz belirli bir dosyayı yok saymak için kullanılır. Bu dosyanın içeriği ilgili değil.
1615903

1
Git belgelerine özellikle kullanmaz diyor git update-index --skip-worktreebu amaçla.
bk2204

43

Genel uygulama, bir oluşturmak devtargets.default.rbve işlemek ve daha sonra her kullanıcıya bu dosyayı devtargets.rb(.gitignore listesindedir) kopyalamasını ister. Örneğin, CakePHP, makineden makineye doğal olarak değişen veritabanı yapılandırma dosyası için aynısını yapar.


6
İzlenen bir dosyayı .gitignore edemezsiniz. .gitignore yalnızca dizinde bulunmayan dosyalar için bir etkiye sahiptir.
CB Bailey

1
Gerçekten iyi bir nedenim olmasa da, bunu yapmaktan kaçınmaya çalışıyordum. şimdi yapıyoruz ve adında ".default" olmadan kendi sürümümü oluşturmanız gerektiğini hatırlamak bir acı olduğunu düşünüyorum.
Derick Bailey

11
@DerickBailey Ama adil olmak gerekirse, dosyayı kopyalamayı hatırlamak, depoyu klonlayan --assume-unchangedherkes için seçeneği kullanmayı hatırlamaktan daha kolaydır .
Dan

1
@DerickBailey, komisyon oluşturmanızı devtargets.default.rbyoksa varsayılan olarak da ayarlayabilirsiniz devtargets.rb.
Luke

@erjang bu devtargets.default.rb dosyasında nedir? Bir örnek?
mmm

2

IntelliJ IDEA kullanıcıları için: Bir dosyadaki (veya dosyalardaki) değişiklikleri göz ardı etmek istiyorsanız, dosyayı farklı bir yere taşıyabilirsiniz Change Set.

  • Şuraya gidin Local Changes( Cmd + 9)
  • Yoksaymak istediğiniz dosyaları seçin
  • F6 onları diğerine taşımak için Change Set
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.