自動コミットメッセージ


Gitは、すべての時間を使用しないかもしれない作り付けの機能がたくさんあるが、それはあなたがそれを必要なときに便利です.一つはフックです.これらは、リモートにプッシュする前にテストをコミットまたは実行する前にコードを整形するようなものを行うために使用できます.今日は、どのように自動的にあなたのコミットメッセージの一部を埋めるために使用できるかを見てみましょう.
どうやってここまで来たの?
私が働いているチームは、コミットメッセージとブランチ名のためにシステムを使用します.gitlabを使用して、彼らは何かのように見える#2 Adds sorting functionality to UI (コミットメッセージの時制について議論することができます)#42/new-sorting-algorithm , それぞれ.
あなたが私のようであるならば、あなたの心はたった今あなたにポンキングしなければなりません確かに我々はすべての必要はありませんか?さて、問題ブランチが問題にスコープされていて、高速順のマージがなければ、ブランチ名は十分でなければなりませんが、コミットされたコミットログなどでは実際には表示されません.
心配するな我々は、コンピュータを我々のためにそれを満たすようにすることができます!
右フックの選択
Gitは、利用できるかなりのフックを持っていますあなたがチェックするならば.git/hooks ディレクトリプロジェクトのディレクトリは、ファイルの束を見つける必要があります名前<hook name>.sample . フック名のほとんどはかなり記述的ですが、いつでもlook them up あなたがより知りたいならば.
我々のケースでは、コミットメッセージバッファが我々のスクリーンに現れる前に、システムにフックすることに興味がありますprepare-commit-msg フック.
自動メッセージを充填
今、私のチームはコミットに使用するテンプレートを持っています#[task number] . この知識を使用すると、いくつかの空想シェルマジックを行うことができますし、枝の名前からタスクを置き換えます.
スクリプト全体は次のようになります.
#!/bin/sh

TASK_NO=$(git rev-parse --abbrev-ref HEAD | cut -d '/' -f 1)
# BSD sed (macOS)
sed -i'' -e "s/#\[task number\]/$TASK_NO/" "$1"

# GNU sed (Linux)
# sed -i -e "s/#\[task number\]/$TASK_NO/" "$1"
BSD sed ( macos )やgnu - sed ( linux )を使用するかどうかによって異なります.sed コマンドは少し異なる振る舞いをする.GNU sedの場合、最初のものの代わりにコメントアウト行を使います.
プログラムの2つのバージョンがどのようにファイルを適切に書くかにはわずかな違いがあります.
The git rev-parse --abbrev-ref HEAD コマンドはあなたに現在のブランチの名前を与えます/ 文字使用cut .
次の(そして最後の)ステップは簡単ですsed 置換#[task number] 枝のタスク番号を文字列で返します.
The $1 最後の行の末尾の変数はコミットメッセージファイルの名前で、スクリプトが自動的に受け取るものです.これを使うためにsed テキストを置き換えるファイル.
そして、好奇心のために、これらはあなたがpre-commit-msg フックpre-commit-msg.sample ファイル名:

COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
SHA1=$3
警告
このスクリプトがあなたが望むことをするとき、かなり重要な例外があります:あなたがまだマスターブランチにいるとき、コミットメッセージがテキストで始まるでしょうmaster . 私は特別なケースを加えることを考えました、しかし、次に、それが私がブランチオフしなければならないとき、それが私が私が覚えているのを助けるという点で実際に非常に役に立つと理解しました.
もう一つの欠点は、コミットメッセージがgitがディスク上で見つけることを期待しているものと異なっているからです.少なくとも、それはVimを使うとき、私が見つけたものです.簡単な回避策はバッファ内のすべてを削除します(dae あなたがものすごいを使うならばtext-obj-entire プラグインを終了する前に.ほとんどの場合、しかし、私はMagit Emacsでは、コミットのキャンセルが期待通りに動作します.
交互アプローチ
私がユーザーに示される前にコミットメッセージを修正することを選んだ間、あなたは潜在的にまた、マシンにIDを自動的に加えることができましたpre-commit フック.
システムがメッセージをパターンにチェックして、それが存在しないならば、予想された問題IDでコミットを修正します.
この解決法は、それが正しいかどうか確かめるどんな方法も与えません、したがって、あなたは多分それを迂回する何らかの方法が欲しいでしょう.