git yerel değişiklikleri koru


132

Yukarı akış değişiklikleri olsa bile belirli dosyalara dokunmadan bir git projesini nasıl güvenli bir şekilde güncelleyebilirim (çekebilirim)?

myrepo / yapılandırma / Config.php

Bu dosya uzaktan kumandada değiştirilse bile, çekmeye gittiğimde, diğer her şey güncellenir, ancak bu dosya değiştirilmez (hatta birleştirilmez)?

PS. İstediğimi yapmam gerekiyor çünkü yalnızca git tabanlı dağıtım betikleri yazıyorum. Yapılandırma dosyalarını şablon olarak değiştiremiyorum.

bu nedenle, yerel olarak değiştirileni kaybetmeyen güncelleme komut dosyaları yazmak için bir yola ihtiyacım var. Şu kadar basit bir şey umuyordum:

git assume-remote-unchanged file1
git assume-remote-unchanged file2

sonra git pull


Değişiklikler yapıldı config.phpmı?
Mark Longair


Taahhütlü değil.
Mecbur kalmamayı

@JhonnyEverson: Aynı genel sorun sınıfı (Bir yapılandırma dosyanız var ve belirli ayarları uygulamak istemiyorsunuz, ancak yapılandırma dosyası yapısının izlenmesi gerekiyor.)
Daenyth

Yanıtlar:


248

Git zulasına dayalı basit bir çözüm var. Değiştirdiğiniz her şeyi saklayın, tüm yeni şeyleri alın, zulanızı uygulayın.

git stash
git pull
git stash pop

Stash pop'ta çatışmalar olabilir. Tarif ettiğiniz durumda, aslında bir çatışma çıkacaktır config.php. Ancak, çatışmayı çözmek kolaydır çünkü zulaya koyduğunuz şeyin istediğiniz şey olduğunu bilirsiniz. Öyleyse şunu yapın:

git checkout --theirs -- config.php

5
git checkout --theirs komutu çok kafa karıştırıcı. Bir kez istediğimi yaptı ve başka bir zaman gerçekten kötü bir şey. Üzerinde iyi bir belge var mı?
Milimetric

3
Evet, bazen 'onların' ve 'bizimkiler' kafa karıştırıcı olabilir. git mergeŞu anda çalışma dizininde olan bir 'bizim' içinde. Ama bir git rebase(veya git rebase -onto) için anlam değiştirilebilir.
GoZoner

1
git stash , git pull , git stash apply Zulayı şununla bırakabilirsiniz: git stash dropDeğişiklikleri başarıyla birleştirdikten sonra
BeingSuman

11
Git ile ilgili olan şey, ne yapacağını anlamanız gerektiğidir. Git ile ilgili diğer bir şey de, zeki insanlar için bile git'in ne yapacağını anlamanın çok zor olmasıdır.
Brad Thomas

1
Gerçekten saklanacak bir şey olup olmadığını kontrol etmelisiniz. Aksi takdirde, daha öncekilerden saklanan değişiklikleri açarsınız git stash.
Jörn Reimerdes

15

Eğer en Elcikler tarafından özelleştirilmiş olması gerekiyordu senin repo bir dosya varsa, o gibi bir şey için dosyayı yeniden adlandırmak config.php.templateve eklemek config.phpadresinden Müşteri .gitignore.


5
bu yanıtı da kontrol edin , .gitattributesbirleştirirken her zaman değişikliklerinizi korumak için kullanabilirsiniz .
KurzedMetal

Bu daha çok ihtiyacım olan şey gibi. Şablon olayı zarif bir çözümdür, ancak korkarım ki sadece konuşlandırma betikleri yazdığım için bunu kullanamam.
Johnny Everson

6

Güncelleme: Bu, sorulan soruyu tam anlamıyla yanıtlıyor, ancak bence KurzedMetal'in cevabı gerçekten istediğiniz şey.

Varsayalım ki:

  1. Şubedesin master
  2. Üst dal masteriçindeorigin
  3. Gerçekleştirilmemiş değişiklik yok

.... yapabilirsin:

# Do a pull as usual, but don't commit the result:
git pull --no-commit

# Overwrite config/config.php with the version that was there before the merge
# and also stage that version:
git checkout HEAD config/config.php

# Create the commit:
git commit -F .git/MERGE_MSG

Sık sık yapmanız gerekiyorsa bunun için bir takma ad oluşturabilirsiniz. Üzerinde taahhütte bulunmayan değişiklikleriniz varsa config/config.php, bunun onları çöpe atacağını unutmayın.



1

Soruyu cevaplamak için: Bir ödünç almanın belirli dosyalarını hariç tutmak istiyorsanız, seyrek teslimatı kullanabilirsiniz.

1) İçinde .git/info/sparse-checkout, saklamak istediğiniz şeyi tanımlayın. Burada, hepsini (*) ama (ünlem işaretine dikkat edin) config.php istiyoruz:

 /*
 !/config.php

2) Git'e seyrek ödemeyi hesaba katmak istediğinizi söyleyin

 git config core.sparseCheckout true

3) Bu dosyayı zaten yerel olarak aldıysanız, git'in seyrek bir kontrolde yaptığını yapın (üzerine "skip-worktree" bayrağını ayarlayarak bu dosyayı dışarıda bırakması gerektiğini söyleyin)

git update-index --skip-worktree config.php

4) config.php dosyanızın size ait olduğu bir deponun keyfini çıkarın - depodaki değişiklikler ne olursa olsun.


Lütfen yapılandırma değerlerinin kaynak kontrolünde OLMAMASI GEREKİR:

  • Potansiyel bir güvenlik ihlali
  • Dağıtım için bunun gibi sorunlara neden oluyor

Bu, onları dışlamanız (ilk işlemden önce .gitignore içine koymanız) ve uygulamanızı satın aldığınız her örnekte uygun dosyayı oluşturmanız gerektiği anlamına gelir (bir "şablon" dosyasını kopyalayıp uyarlayarak)

Gitignore'un bir dosyayı yönetmeye başladıktan sonra herhangi bir etkisi olmayacağını unutmayın.

Buna göre, dosya kaynak kontrolü altında olduğunda, yalnızca iki seçeneğiniz vardır (): - dosyayı kaldırmak için tüm geçmişinizi yeniden git filter-brancholuşturun (ile ) - dosyayı kaldıran bir kaydetme oluşturun. Kaybedilen bir savaşta savaşmak gibidir, ama bazen bununla yaşamak zorunda kalırsınız.


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.