2014-12-02 25 views
5

Mi piacerebbe automatizzare la pulizia delle filiali remote. Voglio essere in grado di verificare se un ramo è già stato fuso in master. Originariamente, il mio piano era di usare git merge-base per vedere l'ultimo commit comune.Controllare se un ramo Git è stato fuso in master quando SQUASHED?

Tuttavia, si scopre che tutti i rami vengono schiacciati mentre li uniamo in master. Poiché questo crea un nuovo hash di commit, non riesco a trovare i commit comuni tra master e le mie filiali.

Come posso determinare se un ramo è stato unito se li abbiamo schiacciati tutti durante l'unione?

Grazie in anticipo!

+0

non esattamente affidabile ma 'git log --grep =" unione di $ BRANCH "' o qualcosa potrebbe funzionare, se si inserisce il nome del ramo nei messaggi di commit quando si esegue lo squash unione. –

+0

Purtroppo, non inseriamo sempre il nome del ramo nei messaggi di commit quando eseguiamo l'unione di squash. – emilyxxie

+0

Guadagni qualcosa schiacciando? Puoi sempre schiacciare prima rebase e poi fare una fusione normale. –

risposta

2

Si potrebbe fare una fusione sperimentale e verificare se introduce alcuna modifica, in questo modo:

git checkout -b foo-merge-test-branch master 
git merge --squash foo 
if [ -n "$(git status --porcelain)" ]; then 
    echo "foo has not been merged"; 
else 
    echo "foo is already merged"; 
fi 
git reset --hard && git checkout master && git branch -d foo-merge-test-branch 

Questo funziona solo se nessuno dei file modificati in originale git merge --squash foo visto ulteriori cambiamenti contrastanti su master dal poi.

1

Ecco uno approccio:

  1. utilizzare l'API GitHub per ottenere il capo del CSA per tutte le richieste di pull unite.
  2. Abbina questi SHA alle filiali locali.

se la testa di una filiale locale ha corrisponde a quello di un PR che è stata fusa, allora si può tranquillamente eliminarlo. Ciò funzionerà indipendentemente da come è stato unito il PR (fusione completa, avanzamento rapido, squash e unione).

Ho implementato questo approccio in uno script delete-squashed-branches. Ecco cosa utilizzo assomiglia:

(master) $ git branch 
    delete-merged-prs 
    fixup 
    unmerged-branch 
* master 

(master) $ delete-squashed-branches 
Finding local branches which were merged onto origin/master via GitHub... 
warning: deleting branch 'delete-merged-prs' that has been merged to 
    'refs/remotes/origin/delete-merged-prs', but not yet merged to HEAD. 
Deleted branch delete-merged-prs (was 325a42b). 
warning: deleting branch 'fixup' that has been merged to 
    'refs/remotes/origin/fixup', but not yet merged to HEAD. 
Deleted branch fixup (was e54f54b). 

(master) $ git branch 
    unmerged-branch 
* master 

(. Gli avvisi possono essere ignorati dal momento che i rami sono state fuse sul master tramite Squash & unione)

Avvertenze:

  • Avrai bisogno di pip install pygithub usare la sceneggiatura.
  • Cerca i rami locali che sono stati uniti su origin/(current branch). Quindi ti consigliamo di eseguirlo su master, develop o qualsiasi altro ramo di lavoro.
  • Se si dispone di più diramazioni di lunga durata, questo approccio non funzionerà molto bene.