2015-05-11 33 views
5

Sto lavorando ad uno script di bash per il mio team per far rispettare regolarmente il rebasing dei rami di lavoro. Il problema che sto affrontando al momento è come determinare se un ramo è dietro il master e/o se ha bisogno di essere ridefinito, piuttosto che tentare ciecamente di ribattere il ramo.Come verificare pragmaticamente con lo script di bash se è necessario ridefinire un ramo in git?

Ecco una versione semplificata di quello che ho finora:

#Process each repo in the working directory. 
for repo_dir in $(ls -1); do 
    # if working branch is clean ... 

     # BEGIN update of local master 
     git checkout master 
     git fetch origin 
     git merge remotes/origin/master 
     # END update of local master 

     for sync_branch in $(git branch | cut -c 3-); do 
      if [ "$sync_branch" != "master" ]; then 
       # BEGIN rebase working branch 
       git checkout $sync_branch 
       git rebase master 
       # Do NOT push working branch to remote. 
       # END rebase working branch 
      fi 
     done 
    fi 
done 

Tutte le idee sarebbe molto apprezzato. Grazie!

+1

Penso che non ce ne sia bisogno. 'git rebase' dovrebbe controllarlo e trasformarsi in un no-op (" Current branch è aggiornato. ") se il ramo ha il capo del master nel suo log di commit. – PSkocik

+0

@PSkocik Il motivo per cui voglio farlo è diverso dalla capacità di auto-controllo di 'git rebase'. Ci sono altre azioni che voglio che il mio script esegua a seconda che sia necessario o meno un rebase. –

risposta

12

Per sapere se è necessario rebase del ramo, è necessario scoprire quale è l'ultimo commit e quale era l'ultimo commit condiviso dalle due filiali.

Per trovare l'ultima commit sul ramo:

git show-ref --heads -s <branch name> 

quindi per individuare l'ultimo commit che i rami hanno in comune:

git merge-base <branch 1> <branch 2> 

Ora tutto quello che dovete fare è scoprire se questi due commit sono lo stesso commit. Se lo sono, non è necessario rebase. Se non lo sono, è necessario un rebase.

Esempio:

hash1=$(git show-ref --heads -s master) 
hash2=$(git merge-base master foo/bar) 
[ "${hash1}" = "${hash2}" ] && echo "OK" || echo "Rebase is required" 

Anche se, come indicato nel commento, se si tenta di rebase un ramo che è già aggiornato. Git gestirà con garbo la situazione e uscirà.

+0

Sembra funzionare quando il master locale si trova allo stesso livello di commit dell'ultimo commit del ramo di lavoro. Tuttavia, non gestisce quando il ramo di lavoro può essere già basato sul master, ma è più impegnato prima del master. Qualche idea? –

+1

Quale ramo stai facendo 'show-ref' on? Dovrebbe essere padrone. Fondamentalmente i due comandi sono per controllare e vedere se l'ultimo commit su master è la base unione per il ramo di lavoro. I commit che si trovano sul ramo di lavoro non dovrebbero avere alcuna importanza. – Schleis

+0

Grazie! Funziona molto meglio ora. :) –