2つのgitコミットが与えられた場合、それらの間の履歴が線形であるかどうか、配管コマンドを使用するのが理想です。言い換えればgitの履歴が線形であるかどうかはどのように決定しますか?
は、私がこれを持っているかどうかを知りたい:
A-B-C-D-E-F-G
ではなく、この:マージ:
/-C-\
A-B -E-F-G
\-D-/
2つのgitコミットが与えられた場合、それらの間の履歴が線形であるかどうか、配管コマンドを使用するのが理想です。言い換えればgitの履歴が線形であるかどうかはどのように決定しますか?
は、私がこれを持っているかどうかを知りたい:
A-B-C-D-E-F-G
ではなく、この:マージ:
/-C-\
A-B -E-F-G
\-D-/
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
磁器よりも高いレベルで妥協するのであれば、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())
git rev-list --min-parents=2 --count A..G
複数の親を持つコミットの数を与えます。 Count '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つのルートのコミット、A
、D
、およびE
があります。セットはG
から到達可能なコミットマイナスA
から到達可能なセットがB
、C
、D
、E
、F
、およびG
のすべてを残し、そしてC
とF
両方がコミットをマージします。
あなたがマージのチェックに--ancestry-path
を追加し、「G
含むがA
自体を除くG
のA
の子孫と先祖は、あるコミット」にテストを制限したい場合:
git rev-list --count --min-parents=2 --ancestry-path A..G
これはカウントされますあなたの例の埋め込みループは非線形ですが、私の2番目の断片は線形としてカウントします(例えば、C
とF
は最後のグラフのA
の子孫ではありません)。コミットG
が選択され、マージコミットであるため、私の最初のケースはここでは線形とはみなされません。この特定のケースでは、範囲としてA..G^@
を使用する必要があります。 (これは以前からわずかな補正である:我々はG
のすべて親を、望んでいないだけで最初の1、我々は右のいずれか(複数可)を選択する--ancestry-path
に依存します。)
[prahlaヴェンカタ](のhttp:/ /stackoverflow.com/a/41546204/86072)はさらに優れた変種を与えました。 '--min-parents'は実際には' git rev-list'コマンドのフラグであり、 'git rev-list'には組み込みの' --count'フラグがあります(選択したコミットの数を数えます)。 – LeGEC
'--min-parents'と' --count'の処理は 'git log'と共有されていますが、' --count'は 'git log'と意味をなさないので無視されます。 – torek