プロジェクトでは、コミットに特定のメタデータを追加するために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関数(またはコマンドのインライングループ)を実行する方法です。
'xargs'は入力を*コマンド*に渡すので、' gitLogExtractJIRA'はあなたのコンテキストで実行可能である必要があります。 – l0b0
gitLogExtractJIRAはbash関数であり、このシェルからアクセス可能であることに注意してください。関数への引数の受け渡しをサポートしていないため、xargsが動作していないと推測しています。しかし、私がgit logを実行しても--format = format:%B --no-merges -n2 | xargs -L1 echo "Line" 出力の各行は、コミットごとに1つだけでなく、 "Line"で始まります。 – PSIXO
あなたは '' xargs'で関数を呼び出すことができます(https://stackoverflow.com/a/11003457/96588)。 – l0b0