2016-01-20 31 views
8

Po wykonaniu scalenia z gałęzi w moim oddziale feature, musiałem rozwiązać jeden konflikt w pliku Parameter.java. Uruchomiłem narzędzie do scalania Git i rozwiązałem je. Po jego rozwiązaniu wykonałem git commit i otworzyłem Vima za pomocą domyślnego komunikatu zatwierdzenia scalenia.Komunikat zatwierdzania domyślnego wiązania Git, nie uwzględniając konfliktów

Rzecz polega na tym, że domyślny komunikat zatwierdzenia zawiera listę konfliktów, ale zaczynając od #, dlatego zostaną one zignorowane w komunikacie zatwierdzenia.

Merge remote-tracking branch 'origin/base' into feature 

# Conflicts: 
#  Parameter.java 
# 
# It looks like you may be committing a merge. 
# If this is not correct, please remove the file 
#  .git/MERGE_HEAD 
# and try again. 

# Please enter the commit message for your changes. Lines starting 
# with '#' will be ignored, and an empty message aborts the commit. 
# On branch feature 
# All conflicts fixed but you are still merging. 
# 
# Changes to be committed: 
#  modified: Parameters.java 
#  modified: SpecialParameters.java 
#  modified: Traveller.java 

Czy jest jakaś konfiguracja do dodania, aby automatycznie umieścić te linie konfliktu w komunikacie zatwierdzenia? Dlatego usunięcie # na konflikt plików w części Conflicts?

Odpowiedz

8

Możesz użyć haczyka prepare-commit-msg, aby to zrobić.

Kopiowanie .git/hooks/prepare-commit-msg.sample do .git/hooks/prepare-commit-msg

Przykład wewnątrz faktycznie dodaje # do części Conflicts:

case "$2,$3" in 
    merge,) 
    /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; 

Hak ten sens, ponieważ wcześniejsze wersje robiły to domyślnie (jak w Linux git version 1.7.10.4).

Teraz to, co chcesz zrobić jest dokładnie odwrotnie: usuwanie # ze strony konfliktów. Rzeczywiście, git version 2.6.2.windows.1 komentuje się domyślnie konfliktów części więc można po prostu zaktualizować polecenia w prepare-commit-msg z:

/usr/bin/perl -i.bak -ne 's/^#// if /^# Conflicts/ .. /^#\R/; print' "$1" ;; 
+0

'# to hak zawiera trzy przykłady. Pierwsza uwaga dotycząca "Konfliktów", część zatwierdzenia scalenia. "Jest zapisana na początku pliku, więc jest odwrotnie. W każdym razie, próbowałem zmienić nazwę zgodnie z sugestią, wznowiłem Git Bash, ale nadal nie działa, część konfliktów jest nadal komentowana. – jeerbl

+0

Masz rację. Edytowałem swoją odpowiedź. –

+1

Dla perla, zamień 'sed -i.bak '/^# Konflikty: /,/^ # $/s /..//'" $ 1 "' – jthill

-1

Nie musisz dodać go do wiadomości samemu popełnił. Po dokonaniu zatwierdzenia scalenia, jeśli wystąpiły konflikty, git powie Ci, gdzie się znajdują. Po prostu uruchom git show --name-only [commit sha] dla zatwierdzenia, które było scalaniem zawierającym konflikty, a zobaczysz je jako część wiadomości.

+0

Czy możesz pokazać przykład? Przetestowałem to i nie działa. O ile wiem, po zatwierdzeniu Git nie przechowuje żadnych informacji o konfliktach. –

+0

Możesz zobaczyć przykład tutaj: https://help.github.com/articles/resolving-a-merge-conflict-from-the-command-line/ – mohammedkhan

+0

Interesujące. Może to kwestia wersji git. Nie widziałem tego podczas próby. –

1

to wykorzystać, który wykorzystuje sed „S ranges by patterns (i opiera się na jthill's answer)

odczytywane w języku ludzi: W zakresie granic pomiędzy # Conflicts: i # lub (blank line), usunąć poprzednich #(space) lub # (# \?).

sed -i '/start/,/stop/ s/# \?//' 

Przygotowujemy zatwierdzeń-msg haka:

# prepare-commit-msg 
case "$2,$3" in 
    merge,) 
    # Uncomment Conflicts section in merge commit body 
    sed -i '/^# Conflicts:/,/^#\?$/ s/# \?//' "$1" 
    ;; 
    *) ;; 
esac 

co powoduje

Conflicts: 
    GIT-VERSION-GEN 
    RelNotes