2016-07-20 5 views
0

私はgit log --no-walk --tags --decorate=shortのことをしたいと思いますが、すべてのタグだけではなく、指定された範囲soley(コミット範囲)のタグもチェックしたいと思います。タグのログを指定した範囲内でのみ

+0

どのような種類の範囲ですか?日付?コミット/タグIDを開始し終了することによって?何か? – Wolf

+0

@Wolfコミット/タグID。その質問を更新します。 –

+0

"タグ範囲"とは何ですか?タグが 'fred'、' barney'、 'betty'、および' wilma'の場合、どれが範囲ですか? (もっと便利なのは、 'git for-each-ref --format = '%(refname:short)' refs/tags'をプログラムにパイプして、タグ選択を行うことができます。 'git log --no-walk --decorate = short'の追加の引数です。) – torek

答えて

2

編集--simplify-by-decoration破棄(ブランチまたは)それらを指すタグ名を持っていないコミットを持ってjthill noted in a commentgit rev-list(ひいてはgit log)として:

git log --simplify-by-decoration --decorate=short X..Y 

行うことができますちょうどあなたが欲しいものです。残念ながら、テストでは、分岐名を指しているコミットも保持されていることが示されています。 The documentationは、この100%明確ではありません。いくつかのブランチやタグによって参照される

--simplify-by-decoration
コミットが選択されています。

が、その後、後:

--simplify-by-decorationオプションは、 タグによって参照されていないコミットを省略することにより、歴史のトポロジーの唯一の大きな 画像を表示することができます。 ...

元の答えは以下の通りです(動作するはずです)。あなたは「彼らを指すタグを持っている唯一のコミットを選択する」とX..Yのようなものの影響を組み合わせたいよう


OKは、それが聞こえます。

この種の操作行うための2つのメインのGitコマンドがあります。

  • git for-each-ref、あなたはどこにでもrefs/名前空間内から参照名、任意の名前を操作できます。タグはrefs/tags/にあります。

  • git rev-list実際にはgit logと同じコマンドですが、デフォルトでコミットメッセージを表示するのではなく、デフォルトでハッシュが表示されます。 (他にもマイナーな違いがありますが、それらは両方git loggit rev-list 1つのソースファイルから構築されるように似ています。)

あなたがここに持っている主な問題はgit log簡単/ git rev-listを聞かせているときにコミットしている制限することです1つの例ではY ^XまたはX..Y、別の例では--no-walk --tags[=pattern]で選択されていますが、設定交差操作ではそれほど良好ではありません。例えば、git rev-list --no-walk --tags=foo\* --tags=bar\* --branches=baz\*は、foo*またはbar*に一致する名前でタグ付けされたすべてのコミットのIDを出力するか、またはbaz*と一致するブランチ名によってポイントされるような、ユニオンスタイルの操作を制限することができます。

rev-listコマンドフル、任意の設定組合のパイプを使用して操作して--stdinはなく、交差点を行うことができます。これはMercurialの構文はGitリポジトリのを打つつの領域です。。もちろん、Mercurialは、内部で、上にフォールバックするのPythonのすべてを持つことの利点を持っている)

をあなたが欲しい、しかし、二組の交点である:

  • セット1:あなたの範囲選択、 X..Yまたは--since=date1 --until=date2

  • セット2のように、おそらく何か:すべてのは指摘-にコミット(一部または全部)タグによって

コンプこの設定交差点にはいくつかのコードが必要です。 Unixのようなシステムでは、私たちが必要とするすべてのツールがあります:Git自身と、設定された交差点を実行できるcommcommユーティリティは入力をソートする必要があるので、ここでは各セットをsortにパイプします。ですから、短い(7行)スクリプトが必要です。

私たちは、例えば、通常の一時ファイルの決まり文句で始まる:

tf1=$(mktemp) || die "can't make first temp file" 
trap "rm -f $tf1" 0 1 2 3 15 
tf2=$(mktemp) || die "can't make second temp file" 
trap "rm -f $tf1 $tf2" 0 1 2 3 15 

は、今、私たちはgit rev-listを使用して1を設定します:

git rev-list <specifiers> | sort > $tf1 

はその後、我々はgit for-each-refを使用して、2を設定します。注釈付きタグをオブジェクト(通常はコミット、別の注釈付きタグ)に変換したいと仮定しますが、別の注釈付きタグの場合はタグを単独で解決させます)

git for-each-ref --format='%(object)' refs/tags | sort > $tf2 

%(object)であり、%(objectname)ではないことに注意してください。後者は注釈付きタグオブジェクトのIDのみを取得します。

最後に、我々は唯一のの両方一時ファイルでのID、すなわちコミットしたい、我々はすべてが、列3(両方のファイルにある行)抑制comm -12たい:

comm -12 $tf1 $tf2 

出力のをこのスクリプトは表示するコミットのセットです(コミットハッシュを並べ替えることによって決定される順序で、git logに依存してソート順を修正します)。今、私たちは自分のオリジナルのgit logコマンドを使用しますが、選択されたコミットでそれを実行します。

git log --no-walk --decorate=short --date-order $(script) 

(これは、もちろん、すべてのテストされていません)。

git rev-listあれば、我々はGitのシェル内のすべてのこれを行うことができます--stdin-intersectオプションだった:

git log --no-walk --decorate=short $(\ 
    git for-each-ref --format='%(object)' refs/tags | \ 
    git rev-list --stdin-intersect X..Y \ 
) 

を、それは少しスクリプトの必要性故に、しません。

+0

また、 'git log --simplify-by-decoration X..Y'もあります。 – jthill

+0

@jthill:うん、そう、ここでうまくいくだろう。 – torek

+0

@jthillありがとう! –

関連する問題