2012-06-14 2 views
4

Я хотел бы указать номер criss cross merges, который существует в некоторых проектах с открытым исходным кодом Git и Mercurial для исследовательских целей. Любые предложения о том, как это сделать?Как идентифицировать крест крест сливается в Git и Mercurial?

Скрещивание креста может быть определено, если слияние имеет двух разных общих предков. Он разрабатывает новую стратегию слияния Mercurial, которая называется consensus merge, которая будет иметь код ancestor.ancestor(), который будет распространен на всех наиболее распространенных предков. Я еще не мог найти этот новый код, но он многое поможет.

Я не знаю, достаточно Git, но у него, безусловно, есть нечто похожее.

+0

Это интересная ссылка, но более 6 лет ... Интересно, какая новая/пересмотренная версия (с большим количеством ввода Hg/Git/Bzr) будет выглядеть ... –

+0

Возможно, вы захотите переименовать название, чтобы сказать «3-way merge» вместо этого, потому что я никогда не слышал «criss cross merge» где-нибудь раньше ... – poke

+1

@poke, прочитайте ссылку. 3-way merge! = Criss cross merge. Criss cross merge - это когда ветвь A объединяет ветвь B, а ветвь B объединяет ветвь A. Использование трехстороннего слияния в более поздней точке A-> B или B-> A может привести к ошибкам в процессе слияния. –

ответ

1

Я предполагаю, что вы хотите получить количество крест-кросс-слияний между любыми ветвями в репозитории, а не количество раз, когда две ветки были перекрещиваемы. В этом случае следующий сценарий оболочки следует сделать для Git:

#!/bin/sh 

# Get the list of branches and convert it to an array. 
branches=$(git for-each-ref --format='%(refname:short)' refs/heads/) 
branches=($branches) 
N=${#branches[*]} 

cc_merges=0 

# Loop over all combinations of two branches. 
for ((i=0; i<N-1; ++i)); do 
    for ((k=i+1; k<N; ++k)); do 
     a=${branches[$i]} 
     b=${branches[$k]} 
     bases=$(git merge-base --all $a $b | wc -l) 
     if [ $bases -gt 1 ]; then 
      let "cc_merges += 1" 
     fi 
    done 
done 

echo "Number of criss-cross merges in repository: $cc_merges" 

Для Mercurial, как его ancestor() revset и команда debugancestor, к сожалению, только список наибольшего общего предка, а не список всех предков, так что я не в состоянии предложить решение здесь.

Смежные вопросы