👻
コミットメッセージをclaude codeに考えて貰う
aicommits使っていたが、ちょっと不便なのとclaude code maxプランなので
claude code君にコミットメッセージを考えて貰った。
.gitconfig
[alias]
cm = "!f() { \
spinner() { \
local pid=$1; \
local delay=0.1; \
local i=0; \
while kill -0 $pid 2>/dev/null; do \
case $i in \
0) printf \"\\r ⠋ Thinking...\" ;; \
1) printf \"\\r ⠙ Thinking...\" ;; \
2) printf \"\\r ⠹ Thinking...\" ;; \
3) printf \"\\r ⠸ Thinking...\" ;; \
4) printf \"\\r ⠼ Thinking...\" ;; \
5) printf \"\\r ⠴ Thinking...\" ;; \
6) printf \"\\r ⠦ Thinking...\" ;; \
7) printf \"\\r ⠧ Thinking...\" ;; \
8) printf \"\\r ⠇ Thinking...\" ;; \
9) printf \"\\r ⠏ Thinking...\" ;; \
esac; \
i=$(( (i+1) % 10 )); \
sleep $delay; \
done; \
printf \"\\r \\r\"; \
}; \
add_flag=''; \
while [ $# -gt 0 ]; do \
case $1 in \
-a|--all) add_flag='-u' ;; \
-A) add_flag='-A' ;; \
esac; \
shift; \
done; \
[ -n \"$add_flag\" ] && git add $add_flag; \
if [ -z \"$(git diff --staged)\" ]; then \
echo 'No staged changes'; \
return 1; \
fi; \
context=\"Recent commit messages in this project:\n\"; \
context+=$(git log --oneline -10 --pretty=format:'- %s'); \
context+=\"\n\nCurrent changes:\n\"; \
context+=$(git diff --staged); \
additional_prompt=''; \
while true; do \
prompt='Generate a commit message following the project style. If no clear pattern exists, use conventional commits. Output ONLY one-line title. No explanations'; \
if [ -n \"$additional_prompt\" ]; then \
prompt=\"$prompt $additional_prompt\"; \
fi; \
( echo \"$context\" | claude -p \"$prompt\" --system-prompt \"You are git commit writer\" > /tmp/git_cm_msg_$$ 2>&1 ) & \
spinner_pid=$!; \
spinner $spinner_pid; \
msg=$(cat /tmp/git_cm_msg_$$); \
rm -f /tmp/git_cm_msg_$$; \
echo \"Generated: $msg\"; \
read -p 'Use this message? [Y/n/e/r=regenerate with prompt] (default: y) ' choice; \
[ -z "$choice" ] && choice=y; \
case $choice in \
y) git commit -m \"$msg\"; break ;; \
e) git commit -e -m \"$msg\"; break ;; \
n) echo 'Cancelled'; break ;; \
r) \
read -p 'Additional instructions (e.g., \"make it shorter\", \"add more detail\", \"mention the bug fix\"): ' additional_prompt; \
continue ;; \
*) echo 'Please choose y/n/e/r'; continue ;; \
esac; \
done; \
}; f"
cmja = "!f() { \
spinner() { \
local pid=$1; \
local delay=0.1; \
local i=0; \
while kill -0 $pid 2>/dev/null; do \
case $i in \
0) printf \"\\r ⠋ 考え中...\" ;; \
1) printf \"\\r ⠙ 考え中...\" ;; \
2) printf \"\\r ⠹ 考え中...\" ;; \
3) printf \"\\r ⠸ 考え中...\" ;; \
4) printf \"\\r ⠼ 考え中...\" ;; \
5) printf \"\\r ⠴ 考え中...\" ;; \
6) printf \"\\r ⠦ 考え中...\" ;; \
7) printf \"\\r ⠧ 考え中...\" ;; \
8) printf \"\\r ⠇ 考え中...\" ;; \
9) printf \"\\r ⠏ 考え中...\" ;; \
esac; \
i=$(( (i+1) % 10 )); \
sleep $delay; \
done; \
printf \"\\r \\r\"; \
}; \
add_flag=''; \
while [ $# -gt 0 ]; do \
case $1 in \
-a|--all) add_flag='-u' ;; \
-A) add_flag='-A' ;; \
esac; \
shift; \
done; \
[ -n \"$add_flag\" ] && git add $add_flag; \
if [ -z \"$(git diff --staged)\" ]; then \
echo 'ステージされた変更がありません'; \
return 1; \
fi; \
context=\"このプロジェクトの最近のコミットメッセージ:\n\"; \
context+=$(git log --oneline -10 --pretty=format:'- %s'); \
context+=\"\n\n現在の変更内容:\n\"; \
context+=$(git diff --staged); \
additional_prompt=''; \
while true; do \
prompt='プロジェクトのスタイルに従ってコミットメッセージを生成してください。明確なパターンがない場合は、conventional commitsを使用してください。タイトルのみ1行で出力。説明は不要。日本語で生成してください'; \
if [ -n \"$additional_prompt\" ]; then \
prompt=\"$prompt $additional_prompt\"; \
fi; \
( echo \"$context\" | claude -p \"$prompt\" --system-prompt \"あなたはgitコミットメッセージ作成者です。日本語でメッセージを生成してください\" > /tmp/git_cm_msg_$$ 2>&1 ) & \
spinner_pid=$!; \
spinner $spinner_pid; \
msg=$(cat /tmp/git_cm_msg_$$); \
rm -f /tmp/git_cm_msg_$$; \
echo \"生成されたメッセージ: $msg\"; \
read -p 'このメッセージを使用しますか? [Y/n/e/r=再生成] (デフォルト: y) ' choice; \
[ -z "$choice" ] && choice=y; \
case $choice in \
y) git commit -m \"$msg\"; break ;; \
e) git commit -e -m \"$msg\"; break ;; \
n) echo 'キャンセルしました'; break ;; \
r) \
read -p '追加の指示(例: 「もっと短く」「詳細を追加」「バグ修正について言及」): ' additional_prompt; \
continue ;; \
*) echo 'y/n/e/r から選択してください'; continue ;; \
esac; \
done; \
}; f"
gistはこちら
Discussion