2017-01-09 6 views

答えて

3

git log --min-parents=2は表示のみでは、少なくとも2人の親(例えばを持っている人コミットします

あなたが実行することができます)コミット:

# for esthetics : --oneline will output one single line per filtered commit 
git log --oneline --min-parents=2 A..G 

# if output is empty : linear history 

# and : 
git log --oneline --min-parents=2 A..G | wc -l 

# should give you the number of merge commits between A and G 
+0

[prahlaヴェンカタ](のhttp:/ /stackoverflow.com/a/41546204/86072)はさらに優れた変種を与えました。 '--min-parents'は実際には' git rev-list'コマンドのフラグであり、 'git rev-list'には組み込みの' --count'フラグがあります(選択したコミットの数を数えます)。 – LeGEC

+0

'--min-parents'と' --count'の処理は 'git log'と共有されていますが、' --count'は 'git log'と意味をなさないので無視されます。 – torek

0

磁器よりも高いレベルで妥協するのであれば、gitpythonを使用して、1人以上の親とのコミットを探すことができます。

import git 


def is_linear(commit): 
    ncommits = len(commit.parents) 
    if ncommits == 0: 
     return True 
    elif ncommits == 1: 
     return is_linear(commit.parents[0]) 
    else: 
     return False 

repo = git.Repo('.') 
print is_linear(repo.commit()) 
3
git rev-list --min-parents=2 --count A..G 

複数の親を持つコミットの数を与えます。 Count '0'は線形履歴を示します。

0

「Between」はグラフの滑りやすい概念です。

例のようなものをお持ちの場合は、LeGEC's answerは問題ありません(ただし、少し簡略化してgit rev-list --count --min-parents=2 A..Gにして、0以外の結果を確認します)。

しかし、グラフフラグメントは次のようになりますとします

A--B--C 
     \ 
     G 
    /
D--E--F 

が線形考慮すべきA..Gですか?ここでAはルートコミットですが、実際には問題ありません。B..GまたはC..Gを使用することもできます。ここでの問題は、別のルートコミットDがあり、これはGから到達可能ですが、Aの子孫ではありません。 「Aから到達可能なコミットを除き、Gから到達可能なコミットのセットにあるマージコミットであるコミットは、Gです。または:

A--B--C--G 
    /
D--F 
/
    E 

ここでは3つのルートのコミット、AD、およびEがあります。セットはGから到達可能なコミットマイナスAから到達可能なセットがBCDEF、およびGのすべてを残し、そしてCF両方がコミットをマージします。

あなたがマージのチェックに--ancestry-pathを追加し、「G含むがA自体を除くGAの子孫と先祖は、あるコミット」にテストを制限したい場合:

git rev-list --count --min-parents=2 --ancestry-path A..G 

これはカウントされますあなたの例の埋め込みループは非線形ですが、私の2番目の断片は線形としてカウントします(例えば、CFは最後のグラフのAの子孫ではありません)。コミットGが選択され、マージコミットであるため、私の最初のケースはここでは線形とはみなされません。この特定のケースでは、範囲としてA..G^@を使用する必要があります。 (これは以前からわずかな補正である:我々はGすべて親を、望んでいないだけで最初の1、我々は右のいずれか(複数可)を選択する--ancestry-pathに依存します。)

関連する問題