2011-12-20 14 views
5

Il mio repository git ha 2 rami: master e sviluppo. Voglio uno script che unisca tutte le modifiche da sviluppare a master automaticamente.Script per unire automaticamente 2 rami git?

ho usato Jenkins: Il Git plug-clona il repository e quindi questo script (variabile 'versione' è un parametro di lavoro) viene eseguito:

# 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} 

ho provato su un repository di prova e non riesce con :

git merge -Xtheirs sviluppare
CONFLITTO (cancellare/modificare): test.txt eliminato nel sviluppare e modificato in HEAD. Versione HEAD di test.txt lasciata nell'albero.
Unione automatica non riuscita; correggere i conflitti e quindi confermare il risultato.

Come faccio a risolvere questo conflitto automaticamente? Voglio che lo script aggiunga/modifica/cancelli sempre in base al ramo "sviluppo", dal momento che il master non viene mai toccato comunque ...

+3

Lei dice che "master è mai toccato", ma si ottiene un conflitto comunque? Se davvero non fosse mai toccato, sarebbe sufficiente un semplice 'git merge --ff-only origin/develop'. – fge

+1

Se si desidera _replace_ la versione master con la versione 'origin/develop' e non si registra un commit merge, perché preoccuparsi di' merge --nosquash'? Non sarebbe più pulito semplicemente 'git checkout master && git reset origine/sviluppo && git reset --soft HEAD @ {1}' o simile? –

risposta

5

La strategia di unione -X theirs funziona solo per risolvere gli hunk in conflitto all'interno di un file. La documentazione per queste opzioni è in the git-merge man page:

 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. 

In questo caso, un ramo ha cancellato il file, mentre l'altro ha modificato, il che è un caso distinto da un semplice pezzo in conflitto tra due rami che hanno reso diverso modifiche.

+0

C'è un modo per far sì che Git scelga automaticamente "cancella il file" se lo ha cancellato? –

1

5 anni .... Ma ancora rilevanti.

Ecco la mia soluzione: cancello ramo principale e creare un nuovo ramo principale dal ramo che voglio 'merge' da:

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"