2017-07-27 7 views
0

プロジェクトでは、コミットに特定のメタデータを追加するためにgit commitメッセージを使用します。最も明白なものはJIRAのidsですが、さらに多くのものがあります。 私がやろうとしているのは、コミットメッセージを処理してこのデータを抽出し、何かを実行することですが、行ごとではなくメッセージごとにスクリプトを実行する方法に問題があります。ここで例えば は私がしようとしているものです:bashを使用してコミットごとにgitログ出力でコマンドを実行する方法

# Extract JIRA issue ids for last 5 commits 
git log --format=format:%B --no-merges -n5 | while read line ; do echo $line | grep -oP "(?<=JIRA:)[^ ]+"; done 

#Output 
456 
128 
756 

がこの場合の作業を行いますが、問題は、使用してここにいる間は、行ごとに実行され、ログ出力の1つのメッセージあたりのgrepはあまり走っているではないので、ということです何度も。私のような何かをしようとすると、これが問題になる:あなたはグレップから各試合を見ることができるように

# Extract JIRA issue id and Gerrit change id from last 5 commits 
git log --format=format:%B --no-merges -n5 | while read line ; do echo $line | grep -oP "(?<=Change-Id:)[^ ]+|(?<=JIRA:)[^ ]+"; done 

#Output 
Ida3e220cdfa80ace5164109916fb5015d7aaaaaa 
Ic4eed79f8acf5bf56f848bf543168e4ac9aaaaaa 
456 
I51dc621df6f54539f05053f6e036cc97a7aaaaaa 
128 
Ic04fa3de9b5e453358292bc7b965139707aaaaaa 
756 
I453a99155dacdc693ee28f248e92a6ccc8aaaaaa 

を別々の先取特権に印刷されていますが、私はフォーマットで出力を取得したいと思います:

変更-ID JIRA

Ida3e220cdfa80ace5164109916fb5015d7aaaaaa
が Ida3e220cdfa80ace5164109916fb5015d7aaaaaa 128 Ic04fa3de9b5e453358292bc7b965139707aaaaaa 756

ことに注意してください。いくつかのコミットにはJira Idがありません。これは最初のコミットの場合のように空の文字列または ""に反映されるべきです。

は私も

# Extract JIRA ids using bash function and xargs 
git log --format=format:%B --no-merges -n5 | xargs -L1 gitLogExtractJIRA 

を使用してみました。しかし、これは私を与えない「xargsの:gitLogExtractJIRA:そのようなファイルまたはディレクトリ」 エラーを

私もhttps://git-scm.com/docs/git-for-each-ref特に--shellサブコマンドを使用してに見えたが、私がrefではなくログメッセージを反復しているので、このケースでは適用できないと思う。私は〜のために〜を使用していないので、あなたは間違っているかもしれません。

私の質問は、行ごとではなく、gitログ出力のメッセージごとにbash関数(またはコマンドのインライングループ)を実行する方法です。

+0

'xargs'は入力を*コマンド*に渡すので、' gitLogExtractJIRA'はあなたのコンテキストで実行可能である必要があります。 – l0b0

+0

gitLogExtractJIRAはbash関数であり、このシェルからアクセス可能であることに注意してください。関数への引数の受け渡しをサポートしていないため、xargsが動作していないと推測しています。しかし、私がgit logを実行しても--format = format:%B --no-merges -n2 | xargs -L1 echo "Line" 出力の各行は、コミットごとに1つだけでなく、 "Line"で始まります。 – PSIXO

+1

あなたは '' xargs'で関数を呼び出すことができます(https://stackoverflow.com/a/11003457/96588)。 – l0b0

答えて

0

私は私が欲しかったものを行うために管理が、私はアプローチがかなりひどいだと思うと断定より最適にそれをしたいと思う:これについて

# Extract ChangeId and JIRA from last 5 commits 
for i in {0..4}; do output="`git log --format=format:%B --no-merges -n1 --skip=$i`";echo `parseChangeId "$output"` `parseJira "$output"`;done; 
# Output 
Ida3e220cdfa80ace5164109916fb5015d7aaaaaa 
Ida3e220cdfa80ace5164109916fb5015d7aaaaaa 128 
Ic04fa3de9b5e453358292bc7b965139707aaaaaa 756 
Ic04fa3de9b5e453358292bc7b965139707aaaaaa 
Ic04fa3de9b5e453358292bc7b965139707aaaaaa 456 

主な問題は、私は5回の代わりに、gitのバイナリを呼び出していますということですこれは無駄ですが、エコーは5回呼ばれ、parseChangeIdとparseJira(これらはgrepのラッパーです)の不要な呼び出しである可能性があります。現在の実装では5回コールする必要があります。

また、git logの件名をこの出力に追加したいのですが、この方法で行うには、別の呼び出しを%s形式のgitログに追加するだけです。

関連する問題