Git のコミットメッセージを自動翻訳する
はじめに
さまざまな理由で Git のコミットメッセージを母国語以外で書く必要がある場面があるかと思います。母国語以外でコミットメッセージを書こうとすると、言語の壁から "fixed" 1 単語みたいな意味のないコミットメッセージになりがちです(要出典)。これを避けるためにコミットメッセージを母国語で書いて機械翻訳することを考えます。
prepare-commit-msg フック
Git の prepare-commit-msg を使うと、コミットメッセージの書き換えが簡単にできます。
prepare-commit-msg は 3 つの引数をとり、 1 つ目の引数($1
)がコミットメッセージを含むファイル名です。このファイルを上書きすることでコミットメッセージを書き換えることができます。
例えば以下のようにするとコミットメッセージがつねに hoge になります。
#!/bin/bash
COMMIT_MSG_FILE="$1"
echo "hoge" >"$COMMIT_MSG_FILE"
機械翻訳 API
メッセージの翻訳には好きな機械翻訳 API が利用できます。例えば以下に挙げるようなものがあります。
機械翻訳 API | 処理 | Markdown 対応 | 無料枠 |
---|---|---|---|
Amazon Translate | 非同期 | ✘ | 200 万文字 |
Azure Cognitive Services Translator(テキスト翻訳) | 同期 | ✘ | 200 万文字 |
Azure Cognitive Services Translator(ドキュメント翻訳) | 非同期 | ✓ | 200 万文字 |
Cloud Translation | 同期 | ✘ | 50 万文字 |
DeepL API | 同期 | ✘ | 50 万文字 |
※ 2022 年 8 月 4 日時点
コミットメッセージを自動翻訳する
Azure Cognitive Services Translator(テキスト翻訳)を使う場合を例にします。この翻訳サービスは Markdown をサポートしませんが、 Markdown テキストを送っても経験的にそんなにフォーマットは崩れません。英語に翻訳する場合は以下のように prepare-commit-msg フックを作成します。
#!/bin/bash
COMMIT_MSG_FILE="$1"
commit_message=$(
cat "${COMMIT_MSG_FILE}" \
| sed -z 's/\n/\\n/g;s/"/\\"/g'
)
translation_result=$(
curl -X POST "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=en" \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: <作成したリソースのキー>' \
-H 'Ocp-Apim-Subscription-Region: <作成したリソースのリージョン>' \
-d "[{\"Text\":\"${commit_message}\"}]"
)
echo $translation_result | jq -r ".[0].translations[0].text" >"$COMMIT_MSG_FILE"
補遺
より便利に使うための Tips。
翻訳後に修正が必要な場合
機械翻訳を修正する必要がある場合は、 git rebase -i HEAD
で reword すれば好きなエディターでコミットメッセージを修正できます。
全リポジトリー一括対応
デフォルトではリポジトリー内の .git/hooks
内にフックのファイルを指定しますが、 core.hooksPath
の config でオーバーライドすることができます。 git config --global core.hooksPath
で全リポジトリーのデフォルトのフックを指定することができます。
上記のスクリプトの URL パラメーターの to
に与える値を環境変数で指定するようにすれば、コミット時に必要なときだけ翻訳するように変えるのも簡単です。
Discussion