2013-03-29 10 views
6

Pracuję nad badaniem, aby studiować połączenia w projektach open source.Jak mogę znaleźć wszystkie scalenia, które miały konflikty w repozytorium Git?

Ostatnio zapytałem How can I find all the commits that have more than one parent in a Git repository? i otrzymałem bardzo dobre odpowiedzi.

Teraz muszę zawęzić moje zapytanie, aby znaleźć tylko te, które miały konflikty.

Z konfliktami mam na myśli to, że ten sam plik został zmodyfikowany w dwóch składających się zeznaniach.

Byłoby bardzo przydatne, gdybym mógł znaleźć polecenie git lub bash (grep, awk?), Które daje mi tylko te zatwierdzenia, w których ta sama linia została zmodyfikowana przez dwóch współpracowników.

Chodzi o to, aby znaleźć zatwierdzenia, których nie można automatycznie rozwiązać.

Jak mogę znaleźć wszystkie scalenia, które miały konflikty w repozytorium git?

+0

W przypadku gdy ktoś jest zainteresowany, to samo pytanie dla Mercurial też: http://stackoverflow.com/questions/15707690/how-can-i-find-all-the-merges-that-had -konfliktowe-w-merkurial-repozytorium – macrobug

Odpowiedz

4

Po utworzeniu zatwierdzenia scalenia informacja o tym, jak zostało wykonane scalanie, została niestety utracona. Jest to ważne, ponieważ git merge akceptuje wiele opcji, takich jak opcje strategii i strategii, które wpływają na pojawianie się konfliktów. Jeśli jednak Twoim celem jest pokrycie uzasadnionego przypadku znalezienia połączeń, to spowodowałoby, że powodowałoby konflikty z domyślnymi opcjami scalania, możliwe jest brutalne wymuszanie: przechodzenie przez scalanie zatwierdzeń, odtwarzanie ich scaleń i oznaczanie flagą raporty git.

Uwaga: ten skrypt sprawdza wiele różnych zatwierdzeń i uruchamia git reset --hard, a nawet git clean -fdx w każdej iteracji. Pamiętaj, aby uruchamiać go tylko w kasie, która nie zawiera ważnych plików nieznanych git!

#!/bin/bash 

old_branch=$(git symbolic-ref --short HEAD) 
for commit in `git rev-list --merges HEAD` 
do 
    # find the parents of the merge commit 
    parents=$(git log -1 --format=%P $commit) 
    fst=${parents%% *} 
    rest=${parents#* } 
    # check out the first parent 
    git checkout -q $fst 
    # merge with the rest of them 
    git merge --no-commit $rest >/dev/null 2>&1 
    # if there are any conflicts, print the commit and abort the merge 
    if git ls-files --unmerged | grep -q '^'; then 
    echo $commit 
    git merge --abort 
    fi 
    # get rid of changes so the next checkout doesnt complain 
    git reset -q --hard 
    git clean -fdxq 
done 
git checkout -q $old_branch 
+0

Dziękujemy użytkownikowi4815162342! Dokładnie tego potrzebowałem. – macrobug

Powiązane problemy