2015-05-11 24 views
5

Pracuję nad skryptem basha dla mojego zespołu, który wymusza regularne przekierowywanie działających oddziałów. Problemem, z którym obecnie borykam się, jest ustalenie, czy gałąź znajduje się za mistrzem i/lub czy należy ją zmienić, zamiast ślepo próbować zmienić gałąź.Jak pragmatycznie sprawdzić przy pomocy skryptu Bash, czy gałąź w git musi zostać ponownie utworzona?

Tutaj jest uproszczoną wersją tego, co mam do tej pory:

#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 

Wszelkie pomysły będą mile widziane. Dzięki!

+1

Myślę, że nie ma takiej potrzeby. 'git rebase' powinien to sprawdzić i zmienić w no-op (" Bieżąca gałąź jest aktualna. "), jeśli gałąź ma głowę nadrzędną w swoim dzienniku zatwierdzenia. – PSkocik

+0

@PSkocik Mój powód, dla którego chcę to zrobić, jest inny niż zdolność 'git rebase' do samodzielnego sprawdzenia. Są inne działania, które chcę wykonać w moim skrypcie, w zależności od tego, czy był potrzebny rebase. –

Odpowiedz

12

Aby stwierdzić, czy musisz zmienić nazwę oddziału, musisz dowiedzieć się, jakie jest ostatnie zatwierdzenie i jakie było ostatnie zatwierdzenie, z którego korzystają te dwie gałęzie.

Aby znaleźć najnowsze popełnić na gałęzi:

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

Następnie wybrać ostatni zobowiązać się, że oddziały mają wspólnego:

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

Teraz wszystko co musisz zrobić, to dowiedzieć się, czy te dwa zatwierdzenia są tym samym zatwierdzeniem. Jeśli tak, to nie musisz się odnawiać. Jeśli tak nie jest, wymagany jest rebase.

Przykład:

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

Choć jak wspomniano w komentarzu, jeśli próba zmieniają bazę oddział, który jest już aktualne. Git z wdziękiem poradzi sobie z sytuacją i wyjdzie.

+0

Wydaje się to działać, gdy lokalny wzorzec jest na tym samym poziomie zatwierdzania, co ostatni zatwierdzenie działającego oddziału. Jednak nie działa, gdy gałąź robocza może już być oparta na systemie głównym, ale jest kilka zatwierdzeń przed wzorcem. Jakieś pomysły? –

+1

Którą gałąź robisz 'show-ref' na? To powinien być pan. Zasadniczo te dwie komendy mają sprawdzić i sprawdzić, czy ostatnie zatwierdzenie na wzorcu jest bazą scaloną dla działającej gałęzi. Działania podejmowane w branży roboczej nie powinny mieć żadnego znaczenia. – Schleis

+0

Dzięki! Teraz działa znacznie lepiej. :) –