2011-12-20 16 views
5

Git veri havuzumun 2 şubesi var: master ve geliştir. Tüm değişikliklerin otomatik olarak oluşturulmasını sağlayan bir komut dosyası istiyorum. 2 git dalını otomatik olarak birleştirmek için komut dosyası mı?

Ben Jenkins kullandı:

# merge 
git checkout -b develop origin/develop 
git checkout master 
git merge -Xtheirs --squash develop -m "v${version}" 

# commit 
git commit -m "v${version}" 

# tag 
git tag v${version} -m "v${version}" 

# push 
git push origin v${version} 

Ben bir test depo üzerinde denedim ve başarısız: Git klonları depoyu ve sonra bu komut dosyası ('sürümün' değişken bir iş parametredir) çalıştırılır eklentisi :

git -Xtheirs
UYUŞMAZLIĞI (/ silme değiştirme) geliştirmek birleştirme: sınama.txt geliştirmek silinir ve HEAD modifiye. Test.txt dosyasının HEAD'si ağaçta kaldı.
Otomatik birleştirme başarısız; çakışmaları düzeltin ve sonucu işleyin.

Nasıl bu çatışmayı otomatik giderebilirim? Komut dosyasının her zaman "geliştirme" dalına göre dosya eklemesini/değiştirmeyi/kaldırmayı istiyorum, çünkü ana zaten hiçbir zaman dokunulamayacak ...

+3

Sen "ana dokunmadık" demekle ancak bir olsun çatışma yine de? Asla dokunmadığı takdirde, basit bir 'git birleştirme - sadece köken/geliştir' yeterli olacaktır. – fge

+1

Ana sürümü 'origin/develop' sürümüyle _replace_ istiyorsanız ve birleştirme işlemini kaydetmiyorsanız, neden 'birleştirme - nosquash' ile uğraşmak istemezsiniz? Sadece git checkout master && git reset origin/develop && git reset --soft HEAD @ {1} 'ya da benzeri için temizleyici olmaz mıydı? –

cevap

5

Birleştirme stratejisi, yalnızca bir dosya içindeki çakışan hunks'leri çözmek için çalışır. Bu durumda

 ours 
      This option forces conflicting hunks to be auto-resolved 
      cleanly by favoring our version. Changes from the other tree 
      that do not conflict with our side are reflected to the merge 
      result. 

      This should not be confused with the ours merge strategy, which 
      does not even look at what the other tree contains at all. It 
      discards everything the other tree did, declaring our history 
      contains all that happened in it. 

     theirs 
      This is opposite of ours. 

, bir dal farklı yaptık iki kol arasındaki basit çelişkili iri parça dan ayrı durumdur daha bunu değiştirdi iken dosyayı sildi: bu seçenekler için dokümantasyon the git-merge man page içindedir modifikasyonları.

+0

Git, silme işlemini sildiyse otomatik olarak "dosyayı sil" seçeneğini seçmenin bir yolu var mı? –

1

5 yaşında .... Ama yine de alakalı. Ben ana şube silip ben den 'birleştirme' istemek daldan yeni bir ana dalı oluşturmak: Burada

benim çözüm

GIT_BRANCH_TO_MERGE_FROM=`git symbolic-ref HEAD | sed 's!refs\/heads\/!!'` 
GIT_BRANCH_TO_MERGE_TO="master" 

git checkout "${GIT_BRANCH_TO_MERGE_TO}" 
git checkout "${GIT_BRANCH_TO_MERGE_FROM}" 

# Delete TO branch 
git branch -D "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to delete ${GIT_BRANCH_TO_MERGE_TO}" 
git push origin :"${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} delete to origin" 

# Create TO branch 
git checkout -b "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to create local branch ${GIT_BRANCH_TO_MERGE_TO}" 
git push origin "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} to origin"