Git'in bir dosyada gelecekteki revizyonları yok saymasını nasıl sağlayabilirim?


140

Git havuzunda bulunan bir dosyanın varsayılan sürümünü oluşturdum. Birisi depoyu klonladığında, bu dosyanın bir kopyasını alması önemlidir. Ancak git'i daha sonra bu dosyadaki değişiklikleri göz ardı edecek şekilde ayarlamak istiyorum. .gitignoreyalnızca izlenmeyen dosyalarda çalışır.

Motivasyonum, bu dosyanın makineye özel bilgiler içermesi. İnsanların orijinal depoya geri gönderilmeyecek yerel değişiklikler yapmalarına izin verirken, yeni değişiklikler aldığımızda birleştirme çakışmaları yaratırken, varsayılan değerleri sağlamak istiyorum.

Genelde oldukça tembelliyiz ve git add .çok kullanıyoruz, bu yüzden git'e bu dosyayı görmezden gelmesini söyleyemezsem, bu dosyadaki değişiklikler işlenecek ve itilecek.

Özetlemek,

  1. Bir dosya oluşturmak istiyorum, default_values.txtgit veri havuzuma eklenen ve birisi bu depoyu klonladığında dahil edilecek olanı çağırmak istiyorum.
  2. git add .eklemek gerekir default_values.txtişlemeye.
  3. Bu davranış, havuzun herhangi bir klonuna aktarılmalıdır.

1
Değiştirilen dosya default_values.txt (diyelim) ise, bir commit'i iptal edecek bir pre-commit kancasına sahip olmak için git kancalarını kullanabilir misiniz?
sateesh

1
Git sadeliği, tembel olmayın ve hazırlık alanını doğru şekilde kullanın derler, bunun için.
Xint 0

Git temizleyicileri, leke / temiz komut dosyaları kullanın derler. Bakımı en kolay çözümdür.
Adam Dymitruk

1
Xint0: doğru. ama başkalarının yanlışlıkla giriş yapmasını nasıl önleyebilirsiniz?
Alan

Yanıtlar:


116

Diğerlerinin de belirttiği gibi, iyi bir modern çözüm şudur:

git update-index --skip-worktree default_values.txt

Bu, şunlarla tekrar izin vermeye karar verene kadar hem yerel hem de yukarı akışta o dosyadaki değişiklikleri göz ardı edecektir:

git update-index --no-skip-worktree default_values.txt

Atlandı olarak işaretlenmiş dosyaların bir listesini alabilirsiniz:

git ls-files -v . | grep ^S

Aksine --skip-worktree, --assume-unchangedbir yukarı akış değişikliği çekildiğinde durumun kaybolacağını unutmayın .


2
Depoyu başka biri çeker ve dosyayı düzenlerse, dizinindeki değişiklikler göz ardı edilir mi? --no-skip-worktreeDeğişikliklerini eklemek için yazmak zorunda kalacaklarını umuyorum .
neaumusic

3
Değişiklikleriyle yapılanlar onlar tarafından kontrol edilir. Başka bir deyişle, değişikliklerinin aktarılmasını istemiyorlarsa, depolarındaki dosya üzerinde çalışma ağacı atlamak zorunda kalacaklardı. Herkese gönderilmesi ve ardından sonraki tüm değişikliklerin göz ardı edilmesi gereken bir dosyaysa, herkesin aynı talimatları izlemesi gerekir.
moodboom

3
--skip-worktreeAynı dosya diğer dalda izleniyorsa, dalları değiştirmeden önce bir dosyanın durumunu geri almanız gerekebileceğini unutmayın .
moodboom

3
hmm, işe yarıyor ... dosyada bazı değişiklikler yaptıktan sonra gösterilmedi git status, ancak farklı şubeye ödeme yapmaya çalıştığımda error: Your local changes to the following files would be overwritten by checkout: , hatta -f yardımcı olmuyorerror: Entry 'wix-stores-merchant-app/demo/credentials.js' not uptodate. Cannot merge.
ykravv

1
Bunlara diğer adı git ignoreve var git unignore.
Michael

48

Aradığınız şey git update-index --assume-unchanged default_values.txt.

Daha fazla ayrıntı için dokümanlara bakın: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html


11
bu çalışmıyor. git eklemesine rağmen. yerel daldaki dosyayı yoksay, arşivin bir klonu bu davranışa sahip değildir (klonlanmış arşivdeki default_values.txt dosyasını değiştirirseniz, "git add" ile yürütmeye eklenecektir)
Marc

6
Evet, çünkü bunu sadece yerel depo için ayarlıyorsunuz. Bu tür bilgileri zorlayamazsınız.
tamasd

8
@Indradhanush - bu çözüm kriter 3'ü karşılamıyor - "davranış depodaki herhangi bir klona aktarılmalıdır" - bu yüzden kabul etmedim. Bu iyi bir cevap olmadığı anlamına gelmez.
Marc

3. kriteri hiç fark etmedim. Çünkü onu aramıyordum. :)
Indradhanush Gupta

3
Özel uygulama ayarlarına sahip yerel yapılandırma dosyaları için skip-worktree, assume-unchangeddaha fazla bilgi yerine kullanmak isteyebilirsiniz. Stackoverflow.com/questions/13630849/…
Aaron Hoffman

22

Genel olarak gördüğüm yaklaşım, farklı bir ada sahip bir dosya oluşturmaktır, örneğin: default_values_template.txt ve .gitignore dosyanıza default_values.txt koyun. Kişilere default_values_template.txt dosyasını yerel çalışma alanlarında default_values.txt dosyasına kopyalayıp gerektiğinde değişiklikler yapmalarını söyleyin.


hmmm ... belki default_values_template'i default_values ​​yoksa varsayılan_values'e otomatik olarak kopyalamak için bir hook yazabilirim?
Marc

2
Deneyimlerime göre bunu çözmenin en yaygın yolu budur. Bu, "sadece çalıştığı" için hemen hemen en az dirençli yoldur ve kodunuzun yerel yapılandırma dosyasının var olup olmadığını kolayca kontrol etmesini sağlayabilir ve yoksa yararlı bir hata sağlayabilirsiniz.
Jani Hartikainen

Bence çözüm gerçekten de böyle bir şey yapmak, tercihen her çektiğinizde veya klonladığınızda çalıştırılan bir komut dosyasıyla. Bir fikir, belirli bir uzantıya (örneğin .basefile) sahip herhangi bir şeyin, uzantı bırakılmış bir dosyaya kopyalanması ve ardından dosya adının o dizindeki .gitignore'a eklenmesi olabilir. Bu yüzden bir default_values.txt.basefile dosyası oluşturup bunu taahhüt ettim. Bunu yapacak git veya perl pirzolam yok, ama bunu yapan bir arkadaşıma soracağım ve nasıl çalıştığını size bildireceğim.
Marc

1
@AdamDymitruk: Evet, bu durumda clean / smudge kullanılabilir, ancak bunun en iyi seçenek olduğu açık değil. Örneğin , temizleme / bulaşma araya gireceğinden, insanların dosyayı gerçekten değiştirmek istemesi oldukça zor olacaktır. Aslında burada anlatılan yaklaşımı tercih ederdim.
sleske

1
Git'in kendisinden (özellikle git hooks) bir ipucu alıyorum ve .samplesoneki kullanıyorum. Sizin durumunuzdadefault_values.txt.sample
tir38

5

Leke / temiz komut dosyalarına bir göz atın. Bu yolla dosyanın sürümünü kontrol edebilirsiniz, ancak teslim alındığında, genel / yer tutucu verilerini dosyadaki makineye özgü verilerle değiştirerek dosyayı "lekeleyeceksiniz".

Bunu taahhüt ettiğinizde, makineye özgü bilgileri genel veya yer tutucu bilgilerle değiştirerek "temizleyeceksiniz".

Leke / temiz komut dosyaları belirleyici olmalıdır, çünkü bunları birden çok kez uygulamak, sıradaki sonuncuyu çalıştırmakla eşdeğer olacaktır.

Deponuzu ifşa etmeniz gerekiyorsa, aynı şey parolalar için de uygulanabilir, ancak içerik hassas bilgiler içerebilir.


Clean and Smudge komut dosyaları yerel mi yoksa deponun bir parçası mı?
Alan

Evet. :) ... yani, lekeyi repo üzerinden temiz bir şekilde paylaşabilirsiniz ancak üretim şifreleri gibi hassas veriler içermeleri iyi bir fikir değildir. Bu bir sorun değilse, git komut dosyasını açıkça etkinleştirmenizi gerektirir. Aksi takdirde, insanlar github ve diğer paylaşılan depolar aracılığıyla diğer kullanıcılara kötü amaçlı şeyler yapabilir.
Adam Dymitruk

Bunun hakkında biraz daha okumam gerekiyor. Temel olarak user.json, her geliştiricinin kredisiyle üzerine yazılması gereken bir varsayılanı olan bir proje kurmak istiyorum, ancak dev'in yanlışlıkla kredilerini kontrol etmesini istemiyorum.
Alan

Temiz leke örnek komut dosyaları için etrafta dolaşardım. Bakın ne çıkıyor. Ayrıca, freenode'daki git irc odasına atlayın. Hemen yardım alacaksınız.
Adam Dymitruk

3

Bunu, dizindeki dosyanın içeriğini basitçe listelemek için "temiz" filtreyi tanımlayarak çözdüm.

git show :path/to/myfile sadece belirtilen dosya için dizinin içeriğini yazdırmalıyız, böylece bunu bir komut dosyasında çalışan kopyayı dizindeki el değmemiş kopya ile değiştirmek için kullanabiliriz:

#! /bin/sh

git show :$1

Bunu, ilgili dosya için "temiz" filtre olarak ayarlayın (bunu "değişiklik_sayısı atma" bölümüne koyduğunuzu varsayarak):

$ git config filter.ignore_myfile.clean "discard_changes path/to/myfile"
$ echo "path/to/myfile filter=ignore_myfile" >> .gitattributes

Ne yazık ki, temiz komut dosyasının içinden hangi dosyayı işlediğimizi anlamanın bir yolu olmadığı için, bunu birden çok dosyaya genelleştirmenin bir yolunu bulamıyorum. Elbette, sizi her dosya için farklı bir filtre kuralı eklemekten alıkoyacak hiçbir şey yok, ancak bu biraz saçma.


1

Ekibim için işe yarayan bir çözüm buldum. Githook'larımızı sembolik bağlantılar aracılığıyla paylaşıyoruz ve git'e bir şablon dosyası ekledikten sonra, şablon dosyasının değiştirilip değiştirilmediğini ve değiştirilip değiştirilmediğini kontrol eden bir ön işleme kancası ekledim git reset -- templatefile.txt. Değiştirilen tek dosya buysa, kaydetmeyi de iptal ederim.


-1

Alt modüllere bakmanızı öneririm. Makineye özgü dosyaları bir alt modüle yerleştirirseniz, git add bunu göz ardı etmelidir.


bu iyi bir fikir, ancak o zaman tek dosya havuzunu da git sunucusuna koymam gerekiyor, bu optimalden daha az, çünkü sadece github kullandığımız ve sınırlı sayıda depoya sahip olduğumuz için.
Marc

@Marc, Visual Studio Team Services'a, sınırsız ücretsiz özel projelere ve git depolarına bir göz atın. Kanban panoları, iş öğesi ve hata izleme, kontrolleri çalışma öğeleriyle ilişkilendirin, scrum veya diğer proje türleriyle ilgiliyseniz sprintleri yönetin. Birden fazla platforma karşı geliştirme yapmak için mükemmel yapım araçlarına sahip olmasının yanı sıra, hepsi ücretsiz olan söylenemeyecek kadar çok şey var. Bazı insanlar Microsoft'u olduğu için cürufluyor, ancak github'un yalnızca depo barındırma dışında araçlar açısından sunduğu şeyleri geride bırakıyor. Ücretsiz olarak yapabileceklerinizin sınırları var ama ben bunları nadiren aşıyorum.
Aran Mulholland

@Marc hakkında gerçekten kullanışlı bulduğum bir şey daha, istediğim kadar hesap kurabilirim, bu yüzden kaynak kontrolüne sahip olmak isteyen bir müşteri için bir proje yazıyorsam bir hesap oluşturabilirim, onu kullanabilirim projeyi planlamak, tasarlamak ve yürütmek için ve bitirdiğimde hesabın sahipliğini müşteriye devredebilirim.
Aran Mulholland
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.