Gitのコミットフックを使って、コミット内容をNotionに記録してみています。

実際に使ってるコミットフックは、次のリポジトリにあります。

Git 2.9+からcore.hooksPathというglobalなGit Hookを設定できます。 このglobal hookを使い、どのリポジトリでもpre-commitやpost-commitなどのコミットフックのスクリプトを実行できます。

Notionにコミットログを送るGitフックの作り方

Notionに書き込み用のデータベースを作成し、次のカラムを作りました。

  • Repo
  • Hash
  • Message

.envファイルに次のようにNotionデータベースとAPIトークンを定義します。

GIL_NOTION_GIL_DATABASE_ID='xxx'
GIL_NOTION_GIL_API_TOKEN='xxx'

そして、post-commitに次のようなスクリプトを書きます。

# License: MIT ©️ azu
# https://efcl.info/2023/01/25/gil-notion-git-log/
# .env にNotionの情報を入れる必要があります
# 中で.envを読み込んでいます。
declare scriptDir
declare DOT_ENV
# GIL: Git CommitをNotionに記録する仕組み
declare GIT_COMMIT_LOG
declare GIT_COMMIT_MSG
declare GIT_COMMIT_HASH
declare GIT_REPO_HTTP_URL
declare GIL_NOTION_GIL_DATABASE_ID
declare GIL_NOTION_GIL_API_TOKEN
GIT_COMMIT_LOG=$(git log -n 1 HEAD --format="format:%h %s")
GIT_COMMIT_HASH=$(echo "${GIT_COMMIT_LOG}" | cut -d' ' -f1)
GIT_COMMIT_MSG=$(echo "${GIT_COMMIT_LOG}" | cut -d' ' -f2-)
# skip [Git Cancel] commit
if [[ "${GIT_COMMIT_MSG}" =~ ^\[Git\ Cancel\] ]]; then
  exit 0;
fi
currentDirName=$(basename $(pwd))
parentDirName=$(basename $(dirname $(pwd)))
GIT_REPO_HTTP_URL=$( (git config --get remote.origin.url || echo "https://github.com/${parentDirName}/${currentDirName}") | sed -e 's/.git$//'  -e 's/^ssh:\/\/git@/https:\/\//' -e 's/^[email protected]:/https:\/\/github.com\//' )

scriptDir=$(cd $(dirname ${BASH_SOURCE:-$0}) || exit; pwd)
DOT_ENV="${scriptDir}/../.env"
export $(grep -v '^#' "${DOT_ENV}" | xargs)


NOTION_PAYLOAD=$(cat <<EOF
{
  "parent": { "database_id": "${GIL_NOTION_GIL_DATABASE_ID}" },
  "properties": {
    "Message": {
      "title": [
        {
          "text": {
            "content": "${GIT_COMMIT_MSG}"
          }
        }
      ]
    },
    "Hash": {
      "rich_text": [{
        "text": {
          "content": "${GIT_COMMIT_HASH}"
        }
      }]
    },
    "Repo": {
      "url": "${GIT_REPO_HTTP_URL}"
    }
  }
}
EOF
)
curl -s -X POST https://api.notion.com/v1/pages \
  -H "Authorization: Bearer ${GIL_NOTION_GIL_API_TOKEN}" \
  -H "Content-Type: application/json" \
  -H "Notion-Version: 2022-02-22" \
  --data "${NOTION_PAYLOAD}" > /dev/null & exit 0;

作った理由

  • https://ctzn.network/dev-vlogをみてて、コミットと動画の時間が紐づいてて面白かった。
  • リポジトリ横断で、コミットと時間軸だけで一覧できると面白そうと思って作ってみた
  • postcommitでコミットメッセージとリポジトリを取得して、それをNotionに記録するという感じ

コミットログだけしか送ってないですが、NotionのAPIが画像とか対応したらスクショとかも送ったりすると面白そうだなーとか考えています。 (Rewindみたいな。lolcommits: selfies for software developersというのもあった)

Convential Commitとかバージョンのコミットなんか規則性があるので、それをリポジトリ横断でみたりすると面白い感じはします。

実際に使ってるコミットフックはgit-hooks/post-notion-gil.sh at master · azu/git-hooks · GitHubにあります。 もうちょっと色々やっていて、じぶんのNotionはDailyのページがあるので、それぞれのコミットが自動的にそこに紐づくのようになっています。 日次のページにコミットが紐づくので、その日に何をしたかがわかりやすくなったのは結構よかったです(以前はその日にやったタスクが並んでるけど、タスクにわざわざ切らないコミットは多いため)。

単純にリレーションするだけだと紐づくだけで見えにくいですが、“セクションとして表示”を使うとリレーションの表示方法が変更できます。

特に利点はないですが、コミットメッセージちゃんと書こうとかちょっと思ったりはしました。