2016-03-29 4 views
0

В принципе, я хочу получить предупреждение, если ветвь фильтра изменит фиксацию, которая уже нажата.git: Проверьте, не затронет ли фильтр ветвь уже нажатые коммитты

Пусть я хочу сделать

git filter-branch ... --ancestry-path A^..HEAD 

Конечно, я мог бы создать список пострадавших хэши и «Комм» стричь это список всех хэшей уже подтолкнули. Есть ли более простое решение?

EDIT: меня интересует решение для сценариев.

+1

Интересно, что легче просить прощения, чем спрашивать разрешения: просто внести изменения и попробовать 'GIT push', и если это не удается, возвращается изменение «фильтра-ветки». – larsks

+0

Не достаточно ли проверять только ближайшие дети 'A ^'? (Это должно быть «А», если я правильно понимаю ваше дело). Если они не вытолкнуты, то ни один из коммитов на них не будет также нажат – max630

+0

@ max630: Но как доказать, что они еще не были нажаты? (относительно зарегистрированных в настоящее время пультов) – Henning

ответ

0

Предполагая, что вы впереди master (или любой другой ветви вы работаете) и запустить git status, вы увидите что-то вроде этого:

Your branch is ahead of 'origin/master' by 1 commit. 

Проще всего сделать, это просто запустить ваш filter-branch, а затем снова запустить status. Если ни одно из изменений не повлияет на уже сделанные сообщения, сообщение не изменится. Если вы сделали что-то изменить, что была отодвинута, то сообщение будет что-то вроде:

Your branch and 'origin/master' have diverged, 
and have 1 and 1 different commit each, respectively. 

Если вы хотите, чтобы спасти, сохранить коммита SHA от перед запуском filter-branch, и вы можете вернуться к нему с git reset --hard SHA.

0

Я должен был подчеркнуть, что я искал решение для сценариев. Мое текущее решение является довольно тяжелым и не может работать во всех ситуациях:

#!/bin/bash 

COMMIT="$1" 

git log --format="%H %h %s" --ancestry-path $COMMIT"^.." | \ 
grep -f \ 
    <(comm -12 \ 
    <(git log --format=%H --ancestry-path $COMMIT"^.." | sort) \ 
    <(git log --format=%H $(git for-each-ref --format="%(refname)" refs/remotes/) | sort)\ 
) | \ 
cut -d " " -f 2- | grep "." && { echo 'Some already pushed commits are affected!'; exit 1; } 

git filter-branch ... --ancestry-path $COMMIT"^.."