2014-12-02 2 views
5

Я хотел бы автоматизировать очистку удаленных ветвей. Я хочу, чтобы проверить, если ветка уже была объединена в мастер. Первоначально мой план состоял в том, чтобы использовать git merge-base, чтобы увидеть последнее общее сообщение.Проверка, если ветка Git была объединена с мастером при SQUASHED?

Однако оказывается, что мы раздавливаем все наши ветви, когда мы объединяем их в мастера. Поскольку это создает новый хеш фиксации, я не могу найти общие коммиты между мастером и моими ветвями.

Как я могу определить, если ветка была объединена, если мы срубили их всех при слиянии?

Заранее благодарен!

+0

не очень надежный, но 'git log --grep =" merge $ BRANCH "' или что-то может сработать, если вы поместите имя ветки в сообщениях фиксации, когда вы выполняете слияние сквоша. –

+0

К сожалению, мы не всегда ставим имя ветки в сообщениях фиксации, когда делаем слияние сквоша. – emilyxxie

+0

Получаете ли вы что-нибудь, сдавливая? Вы всегда можете раздавить сначала с помощью rebase, а затем выполнить нормальное слияние. –

ответ

2

Вы могли бы сделать экспериментальную слияния и проверить представляет ли она какие-либо изменения, например, так:

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 

Это будет работать, только если ни один из файлов измененных в исходном git merge --squash foo не видел дальше других конфликтующих изменений на master так тогда.

1

Вот один подход:

  1. Используйте API GitHub, чтобы получить ГОЛОВКА SHA для всех объединяемых запросов выдвижными.
  2. Совместите эти SHA с местными ветками.

Если HEAD локальной ветви соответствует соединению PR, которое было объединено, вы можете безопасно удалить его. Это будет работать независимо от того, как был объединен PR (полное слияние, быстрый захват, сквош и слияние).

Я реализовал этот подход в сценарии delete-squashed-branches. Вот что использование выглядит следующим образом:

(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 

(. Эти предупреждения могут быть проигнорированы, так как ветви были объединены на мастер по Сквоша & Merge)

Предостережения:

  • Вам нужно pip install pygithub для использования сценария.
  • Он будет искать локальные ветви, которые были объединены на origin/(current branch). Таким образом, вы захотите запустить его на master, develop или на любую ветку, из которой вы работаете.
  • Если у вас несколько ветвей с длительным сроком службы, этот подход не будет работать очень хорошо.
Смежные вопросы