Git - Birleştirme sırasında dosyaları yoksay


115

myrepoUzak beanstalksunucuda çağrılan bir depom var .

Yerel makineme klonladım. İki ek dal oluşturuldu: stagingve dev. Bu dalları da uzaklara itti.

Şimdi:

 local                   remote                   server
 --------------------------------------------------------  
 master  ==> Pushes to  `master`  ==> deployed to `prod`
 staging ==> Pushes to  `staging` ==> deployed to `staging`
 dev     ==> Pushes to  `dev`     ==> deployed to `dev`

Ben adlı bir dosya var config.xmlher dalında farklıdır.

Bu dosyayı yalnızca birleştirme sırasında yok saymak istiyorum. Ama repo şubesinden ödeme yaptığımda veya taahhüt ettiğimde bunun dahil edilmesini istiyorum.

Bunu istememin nedeni, belirli dalı çeken (kullanıma alan) ve ilgili sunuculara dağıtan bir dağıtım komut dosyamız olması. Bu nedenle config.xml, söz konusu şubenin dosyasının, konuşlandırıldığında yukarıda belirtildiği gibi belirli sunucuya gitmesine ihtiyacımız var .

Sanırım .gitignoreişe yaramayacak. Diğer seçenekler neler? Yok sayılan dosyanın, önemli olan teslim alma ve tamamlamanın bir parçası olması gerektiğini unutmayın. yalnızca birleştirme sırasında göz ardı edilmelidir.

Teşekkürler!


Varsayılan modunda, git çekme, git getirmenin kısaltmasıdır ve bunu git merge FETCH_HEAD izler. Yani birbirinizle çelişkili olduğunu söylüyorsunuz.
zzk

Eh, onun kasası diyebilirim. Çekmeyin. Soruyu netleştirmek için güncelleyeceğim.
Kevin Rave


2
buna hiç bir çözüm bulabildin mi? git öznitelikleri yalnızca dosyanın birleştirilmekte olan dallar arasında çakışma olduğu durumlarda yararlıdır, bu nedenle her zaman yeterli değildir.
pvinis

sembolik (ardından git gelmez) veya hatta kurtarmaya yönelik sabit bağlantılara baktınız mı?
Frank Nocke

Yanıtlar:


94

--no-commitSeçenekle git merge komutunu kullanarak bu sorunu aştım ve ardından hazırlanan dosyayı açıkça kaldırdım ve dosyadaki değişiklikleri görmezden geldim . Örneğin myfile.txt, aşağıdaki gibi devam ettiğim herhangi bir değişikliği göz ardı etmek istediğimi varsayalım:

git merge --no-ff --no-commit <merge-branch>
git reset HEAD myfile.txt
git checkout -- myfile.txt
git commit -m "merged <merge-branch>"

Atlanacak dosyalar listeniz varsa, 2 ve 3 numaralı ifadeleri bir for döngüsüne koyabilirsiniz.


2
Hızlı ileri alma stratejisinde birleştirme gerçekleştiğinde bir dosyanın üzerine yazılmamasını istiyorsanız "--no-ff" eklerim.
Ilia Shakitko

1
git reset HEAD myfile.txtpeki tam olarak ne yapıyor ? Buradaki amacımıza nasıl yardımcı olur?
Kid_Learning_C

2. ve 3. satırları bir döngüye nasıl koyarsınız?
AndroidDev

52

Git'i buldum attributes. Denemek. Şimdiye kadar çalışıyor. Henüz tüm senaryoları kontrol etmedim. Ama çözüm olmalı.

Stratejileri Birleştirme - Git nitelikleri



1
Git öznitelik belgelerinin birleştirme stratejileri bölümü için doğru bağlantı aşağıdadır
Adrian Laurenzi

3
Bunu iyi bir şekilde açıklanmış bir makalede buldum medium.com/@porteneuve/…
ShawnFeatherly

10
Çatışma yoksa bu bir sorun gibi görünüyor? Dosyalar yine de birleştirilecek mi?
Brett

18

.gitattributes - bir dosya alt dizini veya alt kümesi için öznitelikleri tanımlayan, deponuzun kök düzeyinde bir dosyasıdır.

Git'e belirli bir dosya için farklı birleştirme stratejileri kullanmasını söylemek için niteliği belirtebilirsiniz. Burada var config.xmlolanı şubemiz için korumak istiyoruz . Biz ayarlamak gerek merge=oursiçin config.xmlde .gitattributesdosyaya.

merge=ours git, birleştirme çakışması olursa, bizim (mevcut dal) dosyamızı kullanmasını söyle.

  1. .gitattributesDeponun kök düzeyinde bir dosya ekleyin

  2. İçeri confix.xml yönelik bir öznitelik ayarlayabilirsiniz .gitattributesdosyası

    config.xml merge=ours
    
  3. Ve sonra bizimkiyle birleştirme stratejisi olan bir kukla tanımlayın:

    $ git config --global merge.ours.driver true
    

Eğer birleştirirseniz stagformu devdalı yerine Config.xml dosyası ile birleştirme çakışmaları sahip, geyik şubesinin Config.xml başlangıçta vardı ne olursa olsun sürümü de korumak.


16
Peki ya çatışma yoksa? Birleştirme sırasında belirli bir dosya her zaman nasıl saklanır?
Igor Yalovoy

2
@IgorYalovoy: hayır çelişki olursa aslında karma kimliklerinden çalışır gibi ... iyi, bu biraz zor, ama: eğer config.xmlolduğunu tamamen değişmeden ya dal ucu sürümüne birleştirme tabanından, Git sadece olmadan, değişen sürümü alır merge.ours.driverortama bakıyor . Yani endişelenmekte haklısın.
torek

1
Git Docs'tan kopyala-yapıştır: Birleştirme Stratejileri - Git öznitelikleri. Bağlantı
kyb

Bu yöntem, FYI her seferinde "birleştirme kaydetmeleri" ile sonuçlanır.
rsmets

2
"bizim", tanıtılan yeni strateji için keyfi bir isim gibi görünüyor. Bunu kafa karıştırıcı buldum, çünkü theirsyerleşik bir birleştirme stratejisidir. Ama biri yazabilir görünüyor <pattern> merge=foo, sonra git config --global merge.foo.driver true, ve aynı şekilde çalışacaktır.
Kyle Strand

8

Kullanarak başlayabilir git merge --no-commitve daha sonra birleştirmeyi istediğiniz gibi düzenleyebilirsiniz, örn. Aşamalı hale getirerek config.xmlveya başka bir dosya, ardından kesin . Bundan sonra kancaları kullanarak daha fazla otomatikleştirmek isteyeceğinizden şüpheleniyorum, ancak bence en az bir kez manuel olarak geçmeye değer.


2
Mu git attributesherhangi düz çözümü sunuyoruz? Bunu anlayamıyorum. git-scm.com/book/en/…
Kevin Rave

4

Sen kullanabilirsiniz .gitignoretutmak için config.xmlveri havuzunun out ve daha sonra bir kullanmak kanca işlemek yazı uygun upload config.xmlsunucuya dosya.


1
Bunun bir çeşit hile olduğunu biliyorum. Temiz bir çözüm bulmaya çalışıyorum. Git ne olacak attributes? Nasıl çalıştığına dair bir fikrin var mı? Bunu anlayamıyorum. git-scm.com/book/en/…
Kevin Rave

1
Bunları duymadım, birleştirme = bizim özniteliğini uygulamaya çalışıyorum, umut verici görünüyor.
tlehman

1
Git nitelikleri harika! Git'e metin olmayan dosyaları nasıl ayırt edeceğini bile söyleyebilirsiniz, böylece PDF'leri ayırt etmek için pdf2text'i kullanabilirsiniz!
tlehman

2

Misal:

  1. İki şubeleri var: master,develop
  2. Dosyayı developdalda oluşturdunuz ve birleştirirken yok saymak istiyorsunuz

Kod:

git config --global merge.ours.driver true
git checkout master
echo "path/file_to_ignore merge=ours" >> .gitattributes
git merge develop

Aynı uzantıya sahip dosyaları da göz ardı edebilirsiniz

örneğin, .txtuzantılı tüm dosyalar :

echo "*.txt merge=ours" >> .gitattributes

1

Burada git-update-index - Çalışma ağacındaki dosya içeriklerini dizine kaydedin.

git update-index --assume-unchanged <PATH_OF_THE_FILE>

Misal:-

git update-index --assume-unchanged somelocation/pom.xml


İtmek güzel ama yine de çekerken dosyanın üzerine yazabileceğinden şikayet ediyor.
Rolf

1
dosya girişinizi .gitignore dosyasına eklemeyi denediniz mi? @Rolf
Sireesh Yarlagadda
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.