diff --git a/README.md b/README.md index 8fbde0c..1136947 100644 --- a/README.md +++ b/README.md @@ -22,136 +22,89 @@ --- -## ๐Ÿค” ์™œ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค +## ๐Ÿ“‹ ์™„์„ฑ๋˜๋Š” ์ปค๋ฐ‹์€ ์ด๋Ÿฐ ๋ชจ์–‘์ž…๋‹ˆ๋‹ค -์—ฌ๋Ÿฌ ์ €์žฅ์†Œ์—์„œ ์ปค๋ฐ‹ ๊ทœ์น™์ด ์ œ๊ฐ๊ฐ์ด๊ฑฐ๋‚˜ ์•„์˜ˆ ์—†์—ˆ๊ณ , `git commit --no-verify`๋กœ -๊ฒ€์‚ฌ๋ฅผ ์šฐํšŒํ•ด๋„ ์•„๋ฌด ํ”์ ์ด ๋‚จ์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋”ํ•ด, ์‚ฌ๋žŒ์ด ์•„๋‹ˆ๋ผ AI -์ฝ”๋”ฉ ์—์ด์ „ํŠธ(ํŠนํžˆ Claude Code)๊ฐ€ ์ปค๋ฐ‹์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Š˜๋ฉด์„œ ์ด ๋ฌธ์ œ๊ฐ€ ๊ฒฐ์ •์ ์œผ๋กœ -์ค‘์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. - -**์ด git ์ปค๋ฐ‹ ํ˜•์‹์„ ๊ฐ•์ œํ•˜๋Š” ๊ถ๊ทน์ ์ธ ์ด์œ ๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๋ผ๊ณ  ๋ง์”€๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.** - -1. AI ์—์ด์ „ํŠธ๊ฐ€ ์ˆ˜๋งŽ์€ ์ปค๋ฐ‹์„ ๋‚จ๊ฒผ์„ ๋•Œ, ๋‚˜์ค‘์— ๊ทธ ์ž‘์—… ์ด๋ ฅ์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๊ฒŒ - ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. -2. ๊ทธ๋ ‡๊ฒŒ ๋‚จ์€ ๊ธฐ๋ก์„ ์—ฌ์ „ํžˆ ์‚ฌ๋žŒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. - -ํ˜•์‹์ด ์ผ๊ด€๋˜๋ฉด ์‚ฌ๋žŒ๋„ LLM๋„ `git log` ํ•œ ๋ฒˆ์œผ๋กœ "๋ฌด์—‡์„, ์™œ, ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ•˜๊ณ  -๋ฐ”๊ฟจ๋Š”์ง€"๋ฅผ ๋ฐ”๋กœ ์ฝ์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹๋ณ„ ํ† ํฐ ์†Œ๋น„๋Ÿ‰(`Tokens-Used`/`Tool-Calls`)์„ -๋‚จ๊ธฐ๋Š” ๊ฒƒ๋„ ๊ฐ™์€ ๋ชฉ์ ์˜ ์—ฐ์žฅ์„ ์ž…๋‹ˆ๋‹ค โ€” ๋‹ค๋งŒ ์ด ์ธก์ • ๋ฐฉ๋ฒ•๋ก ์€ ์•„์ง ์‹คํ—˜ ๋‹จ๊ณ„๋ผ๋Š” ์ ์„ -๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค(์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ [ํ›… ์ƒ์• ์ฃผ๊ธฐ](#-ํ›…์„-์ƒ์• ์ฃผ๊ธฐ๋ณ„๋กœ-์ •๋ฆฌํ•ด-๋“œ๋ฆฝ๋‹ˆ๋‹ค)๋ฅผ -์ฐธ๊ณ ํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค). - -## ๐Ÿ› ๏ธ ๋ฌด์—‡์„ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค - -Python ํ›… + ์„ค์ • ํŒŒ์ผ ํ•˜๋‚˜(`hooks/gitformat.conf`) + POSIX sh ์„ค์น˜ -์Šคํฌ๋ฆฝํŠธ(`install.sh`)๋กœ ๊ตฌ์„ฑ๋œ, **git ์ž์ฒด ๊ธฐ๋Šฅ๋งŒ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”** ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. -`core.hooksPath` ยท `init.templateDir` ยท `git interpret-trailers` ๊ฐ™์€ git ๋‚ด์žฅ -๋ฉ”์ปค๋‹ˆ์ฆ˜๋งŒ ์“ฐ๊ณ , ํ›…์€ Python 3 ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์”๋‹ˆ๋‹ค(decision-16) โ€” pip/npm์œผ๋กœ -์„ค์น˜ํ•  ํŒจํ‚ค์ง€๋Š” ์—†์ง€๋งŒ `python3` ์ž์ฒด๋Š” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค([ํ•„์š”์กฐ๊ฑด](#-ํ•„์š”์กฐ๊ฑด์„-๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค)). - -**๋‹ค๋ฃจ๋Š” ๋ฒ”์œ„๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹๊ณผ ํŠธ๋ ˆ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค.** ์–ธ์–ด๋ณ„ lint๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค -(decision-23) โ€” ์ปค๋ฐ‹ ํ˜•์‹์„ ๋งž์ถ”๋Š” ๋„๊ตฌ๊ฐ€ ์–ธ์–ด ๋„๊ตฌ๋ฅผ ๋Œ๋ฆด ์ด์œ ๊ฐ€ ์—†๊ณ , ๊ทธ ๊ฒฐํ•ฉ์ด -์ปจ์Šˆ๋จธ์—๊ฒŒ npm/ruff/clang-format/mvn/sqlfluff์˜ ์กด์žฌ๋ฅผ ์ „์ œํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. - -> โš ๏ธ **์•Œ๋ ค์ง„ ํ•œ๊ณ„**: git-format์€ `core.hooksPath`๋ฅผ ์ ์œ ํ•˜๋ฏ€๋กœ ๊ทธ ์ €์žฅ์†Œ์˜ -> `.git/hooks/*`๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์–ธ์–ด ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด CI์—์„œ ๋Œ๋ฆฌ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค โ€” -> git-format๊ณผ ์ž๊ธฐ ํ›…์„ ํ•จ๊ป˜ ์“ฐ๋Š” ์ง€์› ๋ฐฉ๋ฒ•์€ ์•„์ง ์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. +``` +[docs][backlog] DRAFT-18์„ GF-136์œผ๋กœ ์Šน๊ฒฉ โ† ์‚ฌ๋žŒ(๋˜๋Š” ์—์ด์ „ํŠธ)์ด ์”€ + โ† ๋นˆ ์ค„ (๊ทœ์น™) +์™œ ๋ฐ”๊ฟจ๋Š”์ง€ ์„ค๋ช…ํ•˜๋Š” ๋ณธ๋ฌธ. ํ•œ ์ค„ 72์ž ์ด๋‚ด. โ† ์„ ํƒ, ์‚ฌ๋žŒ์ด ์”€ + โ† ๋นˆ ์ค„ +Task-Id: GF-136 โ†“ ์•„๋ž˜๋Š” ์ „๋ถ€ ํ›…์ด ์ž๋™์œผ๋กœ ๋ถ™์ž„ +AI-Tool: claude-code +AI-Tool-Version: 2.1.267 +Co-Authored-By: Claude +AI-Model: claude-opus-5 +Tokens-Used: 1952818 +Tool-Calls: 2 +Hooks-Commit: c828491 +Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com> +``` -## ๐Ÿช ํ›…์„ ์ƒ์• ์ฃผ๊ธฐ๋ณ„๋กœ ์ •๋ฆฌํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค +`git log` ํ•œ ๋ฒˆ์œผ๋กœ "๋ฌด์—‡์„, ์™œ, ๋ˆ„๊ฐ€(์‚ฌ๋žŒ์ธ์ง€ ์–ด๋–ค ๋ชจ๋ธ์ธ์ง€), ์–ผ๋งˆ๋ฅผ ์จ์„œ ๋ฐ”๊ฟจ๋Š”์ง€"๊ฐ€ +์ฝํžˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. AI ์—์ด์ „ํŠธ๊ฐ€ ์ปค๋ฐ‹์„ ๋Œ€๋Ÿ‰์œผ๋กœ ๋‚จ๊ธธ ๋•Œ ๊ทธ ์ด๋ ฅ์„ ๋‚˜์ค‘์— +๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ , ๋™์‹œ์— ์‚ฌ๋žŒ์ด ์ฝ์–ด๋„ ์ดํ•ด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -> ๊ณต์‹ ๋ฌธ์„œ: [githooks(5)](https://git-scm.com/docs/githooks) +## ๐Ÿงฉ ๊ฐ ํ•„๋“œ๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์–ธ์ œ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ -git์ด ๊ณต์‹์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ํ›…์€ ์ด 28๊ฐœ์ž…๋‹ˆ๋‹ค. ์ด ์ค‘ git-format์ด ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด -์—ฐ๊ฒฐํ•œ ๊ฒƒ์€ ์ปค๋ฐ‹ ๋‹จ๊ณ„์˜ 3๊ฐœ(`pre-commit`/`commit-msg`/`post-commit`)๋ฟ์ด๋ผ๋Š” ์ ์„ -ํ‘œ๋กœ ์ •๋ฆฌํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ›… ์ด๋ฆ„์„ ๋ˆ„๋ฅด์‹œ๋ฉด ์‹ค์ œ ์†Œ์Šค ํŒŒ์ผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. +**์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ** โ€” ์‚ฌ๋žŒ(๋˜๋Š” ์—์ด์ „ํŠธ)์ด ์ง์ ‘ ์”๋‹ˆ๋‹ค. `commit-msg`๊ฐ€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. -| ํ›… | ์‹คํ–‰ ์‹œ์  | git-format ์—ฐ๊ฒฐ | +| ํ•„๋“œ | ๋ฌด์—‡์ธ๊ฐ€ ยท ์™œ ํ•„์š”ํ•œ๊ฐ€ | ๊ทœ์น™ | | --- | --- | --- | -| `applypatch-msg` | `git am` ํŒจ์น˜ ์ ์šฉ ์ „ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ฒ€์ฆ/์ˆ˜์ • | โ€” | -| `pre-applypatch` | `git am` ํŒจ์น˜ ์ ์šฉ ํ›„ ์ปค๋ฐ‹ ์ „ ์ž‘์—… ํŠธ๋ฆฌ ๊ฒ€์‚ฌ | โ€” | -| `post-applypatch` | `git am` ํŒจ์น˜ ์ ์šฉยท์ปค๋ฐ‹ ์™„๋ฃŒ ํ›„ ์•Œ๋ฆผ | โ€” | -| **`pre-commit`** | `git commit` ์ปค๋ฐ‹ ์ „ ์ฝ”๋“œ ๊ฒ€์‚ฌ | [`hooks/pre-commit`](hooks/pre-commit) | -| `pre-merge-commit` | `git merge` ์™„๋ฃŒ ํ›„ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž…๋ ฅ ์ „ | โ€” | -| `prepare-commit-msg` | ๊ธฐ๋ณธ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ค€๋น„ ํ›„ ์—๋””ํ„ฐ ์‹œ์ž‘ ์ „ | โ€” | -| **`commit-msg`** | ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹ ๊ฒ€์ฆ/์ˆ˜์ • | [`hooks/commit-msg`](hooks/commit-msg) | -| **`post-commit`** | ์ปค๋ฐ‹ ์™„๋ฃŒ ํ›„ ์•Œ๋ฆผ(git์ด ํ•ญ์ƒ ์‹คํ–‰์„ ๋ณด์žฅ) | [`hooks/post-commit`](hooks/post-commit) | -| `pre-rebase` | `git rebase` ์ „, ํŠน์ • ๋ธŒ๋žœ์น˜ ๋ฆฌ๋ฒ ์ด์Šค ๋ฐฉ์ง€ | โ€” | -| `post-checkout` | `git checkout`/`switch` ํ›„ ์ž‘์—… ํŠธ๋ฆฌ ์—…๋ฐ์ดํŠธ ํ›„ | โ€” | -| `post-merge` | `git merge`/`pull` ์™„๋ฃŒ ํ›„ | โ€” | -| `pre-push` | `git push` ์ „, ํ‘ธ์‹œ ๊ฑฐ๋ถ€ ๊ฐ€๋Šฅ | โ€” | -| `pre-receive` | (์„œ๋ฒ„์ธก) ์ฐธ์กฐ ์—…๋ฐ์ดํŠธ ์‹œ์ž‘ ์ „ | โ€” | -| `update` | (์„œ๋ฒ„์ธก) ์ฐธ์กฐ๋ณ„ ์—…๋ฐ์ดํŠธ ์ „, ๊ฐ•์ œ ํ‘ธ์‹œ ๋ฐฉ์ง€ | โ€” | -| `proc-receive` | (์„œ๋ฒ„์ธก) ํŠน์ • ์ฐธ์กฐ ์—…๋ฐ์ดํŠธ ์ฒ˜๋ฆฌ | โ€” | -| `post-receive` | (์„œ๋ฒ„์ธก) ๋ชจ๋“  ์ฐธ์กฐ ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ ํ›„, ์•Œ๋ฆผ/๋ฐฐํฌ | โ€” | -| `post-update` | (์„œ๋ฒ„์ธก) ๋ชจ๋“  ์ฐธ์กฐ ์—…๋ฐ์ดํŠธ ํ›„, HTTP ์ •๋ณด ๊ฐฑ์‹  | โ€” | -| `reference-transaction` | ์ฐธ์กฐ ์—…๋ฐ์ดํŠธ ํŠธ๋žœ์žญ์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง | โ€” | -| `push-to-checkout` | push๊ฐ€ ํ˜„์žฌ ์ฒดํฌ์•„์›ƒ ๋ธŒ๋žœ์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ | โ€” | -| `pre-auto-gc` | `git gc --auto` ์ „ | โ€” | -| `post-rewrite` | `commit --amend`/`rebase` ๋“ฑ ์ปค๋ฐ‹ ์žฌ์ž‘์„ฑ ํ›„ | โ€” | -| `sendemail-validate` | `git send-email` ๋ฐœ์†ก ์ „ ํŒจ์น˜ ๊ฒ€์ฆ | โ€” | -| `fsmonitor-watchman` | watchman ์—ฐ๋™ ํŒŒ์ผ ๋ณ€๊ฒฝ ๋ชจ๋‹ˆํ„ฐ๋ง | โ€” | -| `p4-pre-submit` | `git-p4 submit` ์ „ | โ€” | -| `p4-prepare-changelist` | p4 ๊ธฐ๋ณธ ์ฒด์ธ์ง€๋ฆฌ์ŠคํŠธ ์ค€๋น„ ํ›„ | โ€” | -| `p4-changelist` | p4 ์ฒด์ธ์ง€๋ฆฌ์ŠคํŠธ ๋ฉ”์‹œ์ง€ ํŽธ์ง‘ ํ›„ | โ€” | -| `p4-post-changelist` | p4 ์ œ์ถœ ์™„๋ฃŒ ํ›„ | โ€” | -| `post-index-change` | ์ธ๋ฑ์Šค write ์‹œ | โ€” | - -git-format์€ push ๋‹จ๊ณ„(`pre-push` ์ดํ›„)์™€ ์„œ๋ฒ„์ธก ํ›…์€ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ์ปค๋ฐ‹ -๋‹จ๊ณ„๊นŒ์ง€๋งŒ ๋‹ค๋ฃฌ๋‹ค๋Š” ์›์น™(decision-11, decision-12) ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. - -`git commit`์„ ์‹คํ–‰ํ•˜๋ฉด ์—ฐ๊ฒฐ๋œ ํ›…์ด ์•„๋ž˜ ์ˆœ์„œ๋กœ ๊ฐœ์ž…ํ•œ๋‹ค๋Š” ์ ์„ ์ด์–ด์„œ -๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค. - -1. **[`prepare-commit-msg`](hooks/prepare-commit-msg)** โ€” ์ปค๋ฐ‹ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ - **์ „์—** ๋Œ๊ณ , `--no-verify`๋กœ๋„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์‹ค์ธก ๊ทผ๊ฑฐ๋Š” doc-15). ๊ทธ๋ž˜์„œ - ์ปค๋ฐ‹ ๊ทœ์น™ ๊ฐ•์ œ๊ฐ€ ์ด ํ›…์œผ๋กœ ๋ชจ์ž…๋‹ˆ๋‹ค(decision-18). ์ง€๊ธˆ ํ•˜๋Š” ์ผ์€ ์žฌ์ƒยท๋ณ‘ํ•ฉ ์ปค๋ฐ‹ - ๋ฉด์ œ, ์—๋””ํ„ฐ ๊ฒฝ๋กœ ๊ฑฐ๋ถ€, ๊ฒ€์ฆ ๋งˆ์ปค ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. - - **์žฌ์ƒยท๋ณ‘ํ•ฉ ์ปค๋ฐ‹ ๋ฉด์ œ**: cherry-pick/rebase/revert/merge๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์ปค๋ฐ‹์€ - ์ด๋ฏธ ๊ฒ€์ฆ๋œ ์ปค๋ฐ‹์˜ ๋ณต์ œ์ด๋ฏ€๋กœ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - - **์—๋””ํ„ฐ ๊ฒฝ๋กœ ๊ฑฐ๋ถ€**: ์—๋””ํ„ฐ๋Š” ์ด ํ›…๋ณด๋‹ค **๋’ค์—** ์—ด๋ ค์„œ ์‚ฌ๋žŒ์ด ํƒ€์ดํ•‘ํ•œ ์ตœ์ข… - ๋ฉ”์‹œ์ง€๋ฅผ ํ›…์ด ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ `git commit -m`(๋˜๋Š” `-F`)๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค โ€” - ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด "ํ†ต๊ณผํ•œ ์ปค๋ฐ‹์€ ๋ชจ๋‘ ๊ฒ€์ฆ์„ ๊ฑฐ์ณค๋‹ค"๊ฐ€ ์„ฑ๋ฆฝํ•ฉ๋‹ˆ๋‹ค. -2. **[`commit-msg`](hooks/commit-msg)** โ€” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๊ฐ€ `[type][subsystem] ` ํ˜•์‹์ธ์ง€, ์ œ๋ชฉ - 50์ž/๋ณธ๋ฌธ ์ค„ 72์ž ์ด๋‚ด์ธ์ง€, ๋ณธ๋ฌธ์ด ์žˆ์œผ๋ฉด ๋นˆ ์ค„์ด ์žˆ๋Š”์ง€, ๋ธŒ๋žœ์น˜๋ช…์— - Task-Id(`GF-<๋ฒˆํ˜ธ>`, decision-4)๊ฐ€ ์žˆ๋Š”์ง€, (non-Claude-Code AI ๋„๊ตฌ๋ผ๋ฉด) `AI-Model`์ด - ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฑฐ๋ถ€๋˜๋ฉด ์ปค๋ฐ‹ ์ž์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. -3. **(์ปค๋ฐ‹ ์ƒ์„ฑ)** โ€” ํ†ต๊ณผํ•˜๋ฉด git์ด ์‹ค์ œ๋กœ ์ปค๋ฐ‹์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. -4. **[`post-commit`](hooks/post-commit)** โ€” `--no-verify`๋กœ๋„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์—†๊ณ , exit code๊ฐ€ - ์ปค๋ฐ‹ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ์ง€๋„ ๋ชปํ•œ๋‹ค๋Š” ์ ์„ [๊ณต์‹ ๋ฌธ์„œ](https://git-scm.com/docs/githooks)๋กœ๋„ - ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€์ฆ ๋งˆ์ปค๊ฐ€ ์—†์œผ๋ฉด(= ์•ž ํ›…์ด ๋Œ์ง€ ์•Š์€ ๊ฒฝ์šฐ) - `Verify-Bypassed: true`๋ฅผ `git commit --amend`๋กœ ์‚ฝ์ž…ํ•˜๊ณ (decision-3), `Task-Id`, - `Signed-off-by`(decision-10), `Hooks-Commit`๊ณผ, AI ์—์ด์ „ํŠธ๊ฐ€ ์ปค๋ฐ‹ํ–ˆ๋‹ค๋ฉด ์•„๋ž˜ AI - ๊ท€์†/ํ† ํฐ ํŠธ๋ ˆ์ผ๋Ÿฌ๋ฅผ ํ•จ๊ป˜ ๋ถ™์ž…๋‹ˆ๋‹ค(decision-5). - -> ์ด ๊ตฌ์กฐ๋Š” ์žฌ์„ค๊ณ„ ์ค‘์ž…๋‹ˆ๋‹ค(decision-18). ๊ฒ€์ฆ๊ณผ ํŠธ๋ ˆ์ผ๋Ÿฌ ์‚ฝ์ž…์„ -> `prepare-commit-msg`๋กœ ์˜ฎ๊ธฐ๋Š” ์ค‘์ด๊ณ , `pre-commit`์€ ์ด๋ฏธ ์‚ญ์ œ๋์Šต๋‹ˆ๋‹ค. - -| ํŠธ๋ ˆ์ผ๋Ÿฌ | ๊ฐ’ | ์‹ ๋ขฐ ์ˆ˜์ค€ | -| ----------------------------- | -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | -| `AI-Tool`, `AI-Tool-Version` | `AI_AGENT` ํ™˜๊ฒฝ๋ณ€์ˆ˜(Claude Code๊ฐ€ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์— ์ฃผ์ž…) | ๊ฐ•์ œ โ€” LLM์ด ์Šค์Šค๋กœ ๋งŒ๋“  ๊ฐ’์ด ์•„๋‹˜ | -| `AI-Model` | Claude Code: ์„ธ์…˜ ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ์˜ `message.model`(์„œ๋ฒ„ ๋ฐœ๊ธ‰) / ๊ทธ ์™ธ ๋„๊ตฌ: `gitformat.aiModel` ์„ค์ •๊ฐ’ | Claude Code๋Š” ์„œ๋ฒ„ ๋ฐœ๊ธ‰ ์‚ฌ์‹ค / ๊ทธ ์™ธ๋Š” ์ž๊ฐ€์‹ ๊ณ  | -| `Tokens-Used` | ์ด์ „ ์ปค๋ฐ‹ ์ดํ›„ ์„ธ์…˜์—์„œ ์†Œ๋น„๋œ ํ† ํฐ ๋ธํƒ€(๋ˆ„์  ์•„๋‹˜) โ€” Claude Code ์ „์šฉ, ์‹คํŒจ ์‹œ `unavailable (์‚ฌ์œ )` | ์„œ๋ฒ„ ๋ฐœ๊ธ‰ ์‚ฌ์‹ค(Claude Code ํ•œ์ •) / ๊ทธ ์™ธ๋Š” ์‹ค์ธก ์ฑ„๋„ ์—†์Œ | -| `Tool-Calls` | ๊ฐ™์€ ๊ตฌ๊ฐ„์˜ `tool_use` ์ฝ˜ํ…์ธ  ๋ธ”๋ก ๊ฐœ์ˆ˜ | ์œ„์™€ ๋™์ผ | -| `Co-Authored-By` | `AI-Tool`์ด `claude-code`์ผ ๋•Œ๋งŒ ์ž๋™ ์‚ฝ์ž… | ์ž๋™ | -| `Hooks-Commit` | ์ด git-format ํด๋ก  ์ž์ฒด์˜ `git rev-parse --short HEAD` | ์™„์ „ ์ž๋™, ๋ชจ๋“  ์ปค๋ฐ‹์— ์ ์šฉ | -| `Signed-off-by` | ์ปค๋ฏธํ„ฐ ์ •๋ณด(`git log -1 --format='%cn <%ce>'`) | ์™„์ „ ์ž๋™, ๋ชจ๋“  ์ปค๋ฐ‹์— ์ ์šฉ | - -`Tokens-Used`/`Tool-Calls` ์ธก์ •์— ์‹คํŒจํ•˜๋ฉด ์‚ฌ์œ  ์Šฌ๋Ÿฌ๊ทธ์™€ ํ•จ๊ป˜ `unavailable (์‚ฌ์œ )`๋กœ -๊ธฐ๋ก๋œ๋‹ค๋Š” ์ ์„ ๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค โ€” ์‚ฌ์œ  ์Šฌ๋Ÿฌ๊ทธ: `no-session-id`, `transcript-not-found`, -`transcript-unreadable`, `transcript-parse-failed`, `no-usage-channel`์ž…๋‹ˆ๋‹ค. - -์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. - -``` -[fix][login] ๋นˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ์‹œ ํฌ๋ž˜์‹œ ์ˆ˜์ • - -Task-Id: GF-42 -Signed-off-by: Jane Dev -Hooks-Commit: b5bf03a -``` - -git-format์€ ์ปค๋ฐ‹ ๋‹จ๊ณ„๊นŒ์ง€๋งŒ ๋‹ค๋ฃฌ๋‹ค๋Š” ์ ์„ ๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค โ€” `git push`๋Š” ์•„๋ฌด ํ›…๋„ -๊ฑฐ์น˜์ง€ ์•Š๋Š” ํ‰๋ฒ”ํ•œ push์ž…๋‹ˆ๋‹ค(decision-12). +| `type` | ๋ณ€๊ฒฝ์˜ ์ข…๋ฅ˜. `git log`๋ฅผ ์ข…๋ฅ˜๋ณ„๋กœ ๊ฑธ๋Ÿฌ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค | `feat fix docs style refactor perf test build ci chore revert` ์ค‘ ํ•˜๋‚˜ | +| `subsystem` | ์˜ํ–ฅ ๋ฒ”์œ„. ์–ด๋А ๋ถ€๋ถ„์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ์ œ๋ชฉ๋งŒ ๋ณด๊ณ  ์•Œ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค | ์„ ํƒ. `[a-zA-Z0-9_.-]` | +| ์„ค๋ช… | ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ | **50์ž ์ด๋‚ด**(์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œํฌ์ธํŠธ), ๋ช…๋ นํ˜• ํ˜„์žฌํ˜• | +| ๋ณธ๋ฌธ | **์™œ** ๋ฐ”๊ฟจ๋Š”์ง€. ์–ด๋–ป๊ฒŒ๋Š” diff๊ฐ€ ์ด๋ฏธ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค | ์„ ํƒ. ํ•œ ์ค„ **72์ž ์ด๋‚ด**, ์ œ๋ชฉ๊ณผ ๋นˆ ์ค„๋กœ ๋ถ„๋ฆฌ | + +**ํŠธ๋ ˆ์ผ๋Ÿฌ** โ€” ํ›…์ด ์ž๋™์œผ๋กœ ๋ถ™์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด ํƒ€์ดํ•‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. + +| ํŠธ๋ ˆ์ผ๋Ÿฌ | ๋ฌด์—‡์ธ๊ฐ€ ยท ์™œ ํ•„์š”ํ•œ๊ฐ€ | ๋งŒ๋“œ๋Š” ํ›… ยท ๊ฐ’์˜ ์ถœ์ฒ˜ | ์‹ ๋ขฐ ์ˆ˜์ค€ | +| --- | --- | --- | --- | +| `Task-Id` | ์ด ์ปค๋ฐ‹์ด ์–ด๋А ์ž‘์—…์˜ ์ผ๋ถ€์ธ์ง€. ์ปค๋ฐ‹๊ณผ ํƒœ์Šคํฌ๋ฅผ ์ž‡์Šต๋‹ˆ๋‹ค | `post-commit` ยท ๋ธŒ๋žœ์น˜๋ช…์˜ `-<๋ฒˆํ˜ธ>`(decision-4) | ์ž๋™ | +| `AI-Tool`
`AI-Tool-Version` | ์–ด๋–ค ๋„๊ตฌ๊ฐ€ ์ปค๋ฐ‹์„ ๋งŒ๋“ค์—ˆ๋Š”์ง€ | `post-commit` ยท `AI_AGENT` ํ™˜๊ฒฝ๋ณ€์ˆ˜(Claude Code๊ฐ€ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์— ์ฃผ์ž…) | ๊ฐ•์ œ โ€” LLM์ด ์Šค์Šค๋กœ ๋งŒ๋“  ๊ฐ’์ด ์•„๋‹˜ | +| `AI-Model` | ์–ด๋–ค ๋ชจ๋ธ์ด ์ผ๋Š”์ง€. ๋ชจ๋ธ๋ณ„ ์ž‘์—… ํ’ˆ์งˆ์„ ๋‚˜์ค‘์— ๋น„๊ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค | `post-commit` ยท Claude Code๋Š” ์„ธ์…˜ ํŠธ๋žœ์Šคํฌ๋ฆฝํŠธ์˜ `message.model`, ๊ทธ ์™ธ๋Š” `gitformat.aiModel` ์„ค์ •๊ฐ’ | Claude Code๋Š” ์„œ๋ฒ„ ๋ฐœ๊ธ‰ ์‚ฌ์‹ค / ๊ทธ ์™ธ๋Š” ์ž๊ฐ€์‹ ๊ณ  | +| `Tokens-Used` | ์ด ์ปค๋ฐ‹์— ๋“  ํ† ํฐ. ์ž‘์—… ๋น„์šฉ์„ ์ด๋ ฅ์—์„œ ์ฝ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค | `post-commit` ยท ์ง์ „ ์ปค๋ฐ‹ ์ดํ›„ ์„ธ์…˜ ๊ตฌ๊ฐ„์˜ ๋ธํƒ€(๋ˆ„์  ์•„๋‹˜) | ์„œ๋ฒ„ ๋ฐœ๊ธ‰ ์‚ฌ์‹ค(Claude Code ํ•œ์ •), **์ธก์ • ๋ฐฉ๋ฒ•๋ก ์€ ์‹คํ—˜ ๋‹จ๊ณ„** | +| `Tool-Calls` | ๊ฐ™์€ ๊ตฌ๊ฐ„์˜ ๋„๊ตฌ ํ˜ธ์ถœ ์ˆ˜ | `post-commit` ยท `tool_use` ๋ธ”๋ก ๊ฐœ์ˆ˜ | ์œ„์™€ ๋™์ผ | +| `Co-Authored-By` | ๊ณต๋™์ €์ž ๊ท€์† | `post-commit` ยท `AI-Tool`์ด `claude-code`์ผ ๋•Œ๋งŒ | ์ž๋™ | +| `Hooks-Commit` | ์ด ์ปค๋ฐ‹์„ ๊ฒ€์‚ฌํ•œ git-format ์ž์ฒด์˜ ๋ฒ„์ „. ํ›…์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ์—ˆ์„ ๋•Œ ์–ด๋А ์ปค๋ฐ‹๋“ค์ด ๊ทธ ํ›…์„ ๊ฑฐ์ณค๋Š”์ง€ ์—ญ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค | `post-commit` ยท ํ›… ํด๋ก ์˜ `rev-parse --short HEAD` | ์™„์ „ ์ž๋™, ๋ชจ๋“  ์ปค๋ฐ‹ | +| `Signed-off-by` | ์ปค๋ฏธํ„ฐ ์ •๋ณด(DCO ๊ด€๋ก€) | `post-commit` ยท `git log -1 --format='%cn <%ce>'` | ์™„์ „ ์ž๋™, ๋ชจ๋“  ์ปค๋ฐ‹ | +| `Verify-Bypassed` | `--no-verify`๋กœ ๊ฒ€์‚ฌ๋ฅผ ๊ฑด๋„ˆ๋›ด ์‚ฌ์‹ค. ์šฐํšŒ๋ฅผ ๋ง‰์ง€๋Š” ๋ชปํ•˜๋‹ˆ ๋Œ€์‹  ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค(decision-3) | `post-commit` ยท `prepare-commit-msg`๊ฐ€ ๋‚จ๊ธด ๊ฒ€์ฆ ๋งˆ์ปค์˜ **๋ถ€์žฌ** | ์ž๋™ | +| `Fixes` | ์ด ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋“  ์ปค๋ฐ‹ | **์‚ฌ๋žŒ์ด ์”€**(์›์ธ ์ปค๋ฐ‹์„ ์•„๋Š” ๊ฒฝ์šฐ๋งŒ) ยท `commit-msg`๊ฐ€ ํ•ด์‹œ ์‹ค์žฌ๋ฅผ ๊ฒ€์ฆ | ๊ฒ€์ฆ๋จ | + +`Tokens-Used`/`Tool-Calls`๋Š” ์ธก์ •์— ์‹คํŒจํ•˜๋ฉด ์‚ฌ์œ ์™€ ํ•จ๊ป˜ `unavailable (์‚ฌ์œ )`๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค โ€” +`no-session-id`, `transcript-not-found`, `transcript-unreadable`, `transcript-parse-failed`, +`no-usage-channel`. + +## ๐Ÿช ์ปค๋ฐ‹ ํ•œ ๋ฒˆ์— ํ›…์ด ๋„๋Š” ์ˆœ์„œ + +> ๊ณต์‹ ๋ฌธ์„œ: [githooks(5)](https://git-scm.com/docs/githooks). git์ด ์ œ๊ณตํ•˜๋Š” ํ›…์€ 28๊ฐœ์ง€๋งŒ +> git-format์€ ์ปค๋ฐ‹ ๋‹จ๊ณ„๋งŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค(decision-11, decision-12) โ€” `git push`๋Š” ์•„๋ฌด ํ›…๋„ +> ๊ฑฐ์น˜์ง€ ์•Š๋Š” ํ‰๋ฒ”ํ•œ push์ž…๋‹ˆ๋‹ค. + +| ์ˆœ์„œ | ํ›… | ์ปค๋ฐ‹ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”๊ฐ€ | `--no-verify`๋กœ ๊ฑด๋„ˆ๋›ฐ๋‚˜ | git-format์ด ํ•˜๋Š” ์ผ | +| --- | --- | --- | --- | --- | +| 1 | [`prepare-commit-msg`](hooks/prepare-commit-msg) | ์•„์ง ์—†์Œ | **๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์—†์Œ** | ์žฌ์ƒยท๋ณ‘ํ•ฉ ์ปค๋ฐ‹ ๋ฉด์ œ, ์—๋””ํ„ฐ ๊ฒฝ๋กœ ๊ฑฐ๋ถ€, ๊ฒ€์ฆ ๋งˆ์ปค ๊ธฐ๋ก | +| 2 | (์—๋””ํ„ฐ) | ์•„์ง ์—†์Œ | โ€” | ์‚ฌ๋žŒ์ด ๋ฉ”์‹œ์ง€๋ฅผ ์”๋‹ˆ๋‹ค. ํ›…๋ณด๋‹ค **๋’ค**๋ผ์„œ 1๋ฒˆ์€ ์ตœ์ข… ๋ฉ”์‹œ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค | +| 3 | [`commit-msg`](hooks/commit-msg) | ์•„์ง ์—†์Œ | ๊ฑด๋„ˆ๋œ€ | ์ œ๋ชฉ ํ˜•์‹ยท๊ธธ์ด, ๋นˆ ์ค„, `Fixes` ํ•ด์‹œ, ๋ธŒ๋žœ์น˜ `Task-Id`, `AI-Model` ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ฒ€์ฆ | +| 4 | (์ปค๋ฐ‹ ์ƒ์„ฑ) | **์ƒ์„ฑ๋จ** | โ€” | git์ด ์ปค๋ฐ‹ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค | +| 5 | [`post-commit`](hooks/post-commit) | ์žˆ์Œ | ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์—†์Œ | ํŠธ๋ ˆ์ผ๋Ÿฌ๋ฅผ `git commit --amend`๋กœ ์‚ฝ์ž…. exit code๊ฐ€ ์ปค๋ฐ‹ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค | + +์—ฌ๊ธฐ์„œ ๋‘ ๊ฐ€์ง€๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. **์—๋””ํ„ฐ๊ฐ€ 1๋ฒˆ๋ณด๋‹ค ๋’ค์— ์—ด๋ฆฌ๋ฏ€๋กœ** ์ตœ์ข… ๋ฉ”์‹œ์ง€ ๊ฒ€์ฆ์€ +`git commit -m`(๋˜๋Š” `-F`)๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ , ๊ทธ๋ž˜์„œ ์—๋””ํ„ฐ ๊ฒฝ๋กœ๋Š” ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. +๊ทธ๋ฆฌ๊ณ  **4๋ฒˆ์—์„œ ์ปค๋ฐ‹์ด ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง€๋ฏ€๋กœ** `post-commit`์€ ์ปค๋ฐ‹์„ ๋ง‰์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค โ€” +๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐ๋ก๋งŒ ํ•ฉ๋‹ˆ๋‹ค. + +## ๐ŸŽฏ ๋‹ค๋ฃจ๋Š” ๋ฒ”์œ„ + +์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹๊ณผ ํŠธ๋ ˆ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค. **์–ธ์–ด๋ณ„ lint๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค**(decision-23) โ€” +์ปค๋ฐ‹ ํ˜•์‹์„ ๋งž์ถ”๋Š” ๋„๊ตฌ๊ฐ€ ์–ธ์–ด ๋„๊ตฌ๋ฅผ ๋Œ๋ฆด ์ด์œ ๊ฐ€ ์—†๊ณ , ๊ทธ ๊ฒฐํ•ฉ์ด ์ปจ์Šˆ๋จธ์—๊ฒŒ +npm/ruff/clang-format/mvn/sqlfluff์˜ ์กด์žฌ๋ฅผ ์ „์ œํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด +CI์—์„œ ๋Œ๋ฆฌ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค โ€” git-format์ด `core.hooksPath`๋ฅผ ์ ์œ ํ•˜๋ฏ€๋กœ ๊ทธ ์ €์žฅ์†Œ์˜ +`.git/hooks/*`๋Š” ๋ฌด์‹œ๋˜๊ณ , ์ž๊ธฐ ํ›…๊ณผ ํ•จ๊ป˜ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์€ ์•„์ง ์ •ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. + +๊ตฌ์„ฑ์€ Python ํ›… + ์„ค์ • ํŒŒ์ผ ํ•˜๋‚˜(`hooks/gitformat.conf`) + POSIX sh ์„ค์น˜ +์Šคํฌ๋ฆฝํŠธ(`install.sh`)์ž…๋‹ˆ๋‹ค. `core.hooksPath` ยท `init.templateDir` ยท +`git interpret-trailers` ๊ฐ™์€ git ๋‚ด์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋งŒ ์“ฐ๊ณ , ํ›…์€ Python 3 ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ +์”๋‹ˆ๋‹ค(decision-16). ## โœ… ํ•„์š”์กฐ๊ฑด์„ ๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค @@ -164,7 +117,7 @@ git-format์€ ์ปค๋ฐ‹ ๋‹จ๊ณ„๊นŒ์ง€๋งŒ ๋‹ค๋ฃฌ๋‹ค๋Š” ์ ์„ ๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค โ€” | ํ›… | python3๊ฐ€ PATH์— ์—†์„ ๋•Œ | | --- | --- | -| `pre-commit`, `commit-msg` | ํ›…์ด ์‹คํŒจํ•˜๊ณ  git์ด ์ปค๋ฐ‹์„ ๋ง‰์Šต๋‹ˆ๋‹ค โ€” ์—๋Ÿฌ๊ฐ€ ๋ฐ”๋กœ ๋ณด์ด๋Š” ์•ˆ์ „ํ•œ ์‹คํŒจ์ž…๋‹ˆ๋‹ค. | +| `prepare-commit-msg`, `commit-msg` | ํ›…์ด ์‹คํŒจํ•˜๊ณ  git์ด ์ปค๋ฐ‹์„ ๋ง‰์Šต๋‹ˆ๋‹ค โ€” ์—๋Ÿฌ๊ฐ€ ๋ฐ”๋กœ ๋ณด์ด๋Š” ์•ˆ์ „ํ•œ ์‹คํŒจ์ž…๋‹ˆ๋‹ค. | | `post-commit` | ์ปค๋ฐ‹์ด ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋’ค๋ผ git์ด ํ›…์˜ ์‹คํŒจ๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ์ปค๋ฐ‹์€ ์„ฑ๊ณตํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ `Task-Id`/`AI-Model`/`Signed-off-by` ๊ฐ™์€ ํŠธ๋ ˆ์ผ๋Ÿฌ๊ฐ€ ์กฐ์šฉํžˆ ๋ˆ„๋ฝ๋ฉ๋‹ˆ๋‹ค. | GUI git ํด๋ผ์ด์–ธํŠธ(SourceTree, GitHub Desktop, IDE ๋‚ด์žฅ git ํŒจ๋„)๋Š” ์…ธ @@ -203,7 +156,7 @@ cd ~/my-project - **์„ค์น˜ ์ƒ์„ธ, ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์น™ ์ „๋ฌธ, AI ๊ท€์† ํŠธ๋ ˆ์ผ๋Ÿฌ ํ‘œ, ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ, ์ €์žฅ์†Œ ๊ตฌ์กฐ, ์ฃผ์˜์ ยทํ•œ๊ณ„**๋Š” `backlog doc list`์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **์„ค๊ณ„ ๋ฐฐ๊ฒฝ๊ณผ ๊ฐ ๊ฒฐ์ • ์ด์œ **(decision-1~16)๋Š” `backlog decision list`์—์„œ +- **์„ค๊ณ„ ๋ฐฐ๊ฒฝ๊ณผ ๊ฐ ๊ฒฐ์ • ์ด์œ **๋Š” `backlog decision list`์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - **์ž‘์—… ๋‹จ์œ„์™€ ์ง„ํ–‰ ์ƒํ™ฉ**์€ `backlog board`์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - **๋ผ์ด์„ ์Šค**๋Š” MIT์ž…๋‹ˆ๋‹ค(์ „๋ฌธ: [`LICENSE`](./LICENSE)) โ€” ์™ธ๋ถ€ ๋ฌธ์„œ๋ฅผ ์›๋ฌธ ๊ทธ๋Œ€๋กœ diff --git "a/backlog/tasks/gf-136 - README\353\245\274-\354\265\234\354\242\205-\354\273\244\353\260\213-\355\217\254\353\247\267-\354\244\221\354\213\254\354\234\274\353\241\234-\354\236\254\352\265\254\354\204\261\355\225\234\353\213\244.md" "b/backlog/tasks/gf-136 - README\353\245\274-\354\265\234\354\242\205-\354\273\244\353\260\213-\355\217\254\353\247\267-\354\244\221\354\213\254\354\234\274\353\241\234-\354\236\254\352\265\254\354\204\261\355\225\234\353\213\244.md" new file mode 100644 index 0000000..ac249d5 --- /dev/null +++ "b/backlog/tasks/gf-136 - README\353\245\274-\354\265\234\354\242\205-\354\273\244\353\260\213-\355\217\254\353\247\267-\354\244\221\354\213\254\354\234\274\353\241\234-\354\236\254\352\265\254\354\204\261\355\225\234\353\213\244.md" @@ -0,0 +1,92 @@ +--- +id: GF-136 +title: README๋ฅผ ์ตœ์ข… ์ปค๋ฐ‹ ํฌ๋งท ์ค‘์‹ฌ์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•œ๋‹ค +status: Done +assignee: [] +created_date: '2026-09-26 07:55' +updated_date: '2026-09-26 08:01' +labels: + - docs +dependencies: [] +documentation: + - backlog/docs/doc-13 - git-format-์žฌ์„ค๊ณ„-๊ณ„ํš-โ€”-์ปค๋ฐ‹-๊ทœ์น™์„-prepare-commit-msg๋กœ-ํ†ตํ•ฉ.md +modified_files: + - README.md +priority: medium +type: docs +--- + +## Description + + +README๊ฐ€ ๊ตฌํ˜„ ์„œ์ˆ  ์ค‘์‹ฌ์ด๋‹ค โ€” "์™œ ๋งŒ๋“ค์—ˆ๋Š”์ง€ / ๋ฌด์—‡์„ ๋งŒ๋“ค์—ˆ๋Š”์ง€ / ํ›…์„ ์ƒ์• ์ฃผ๊ธฐ๋ณ„๋กœ" ์ˆœ์„œ๋ผ, ์ฝ๋Š” ์‚ฌ๋žŒ์ด ์ •์ž‘ ์•Œ๊ณ  ์‹ถ์€ "๊ทธ๋ž˜์„œ ์ปค๋ฐ‹์ด ์–ด๋–ค ๋ชจ์–‘์ด ๋˜๋Š”๊ฐ€"์— ๋„๋‹ฌํ•˜๊ธฐ๊นŒ์ง€ ํ›… ์„ค๋ช…์„ ๋จผ์ € ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค. + +์œ ์ € ์ง€์‹œ: ์ตœ์ข…์ ์œผ๋กœ ์™„์„ฑ๋˜๋Š” ํฌ๋งท์„ ๋ณด์—ฌ์ฃผ๊ณ , ๊ฐ ํ•„๋“œ์˜ ์˜๋ฏธ๋ฅผ ํ‘œ๋กœ ์ •๋ฆฌํ•˜๊ณ , ์–ธ์ œ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€์™€ ์™œ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€๋ฅผ ํ•จ๊ป˜ ์ •๋ฆฌํ•  ๊ฒƒ. + +๋˜ GF-135์—์„œ ๊ฑฐ์ง“ ์„œ์ˆ ์„ ๊ฑท์–ด๋‚ด๋ฉด์„œ ์˜คํžˆ๋ ค ๋ถ„๋Ÿ‰์„ ๋Š˜๋ ธ๋‹ค(์–ธ์–ด lint ๋ฒ”์œ„ ์„ค๋ช… ๋‘ ๋ฌธ๋‹จ, ์ปจ์Šˆ๋จธ ํ•œ๊ณ„ ์ธ์šฉ ๋ธ”๋ก, prepare-commit-msg ์ค‘์ฒฉ ๋ถˆ๋ฆฟ, ์žฌ์„ค๊ณ„ ์ง„ํ–‰ ์•Œ๋ฆผ ๋ธ”๋ก). ์žฌ๊ตฌ์„ฑํ•˜๋ฉด์„œ ํ•จ๊ป˜ ์••์ถ•ํ•œ๋‹ค โ€” ์ƒˆ ์„ค๋ช…์„ ๋ณดํƒœ์ง€ ์•Š๊ณ  ๊ธฐ์กด ๋‚ด์šฉ์„ ์žฌ๋ฐฐ์น˜ํ•œ๋‹ค. + +์ฃผ์˜: ํ˜„์žฌ ๊ตฌ์กฐ๋Š” ์žฌ์„ค๊ณ„ ์ค‘์ด๋‹ค. ํŠธ๋ ˆ์ผ๋Ÿฌ ์‚ฝ์ž…์€ ์•„์ง post-commit์ด ํ•˜๊ณ  ๋ฉ”์‹œ์ง€ ๊ฒ€์ฆ์€ ์•„์ง commit-msg๊ฐ€ ํ•œ๋‹ค. '์–ธ์ œ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€' ์—ด์€ ์ง€๊ธˆ ์‚ฌ์‹ค๋Œ€๋กœ ์“ฐ๊ณ , GF-127/GF-128์ด ๊ทธ ์‹œ์ ์„ ์˜ฎ๊ธฐ๋ฉด ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค. hooks/README.md์™€ ์ตœ์ข… ์•„ํ‚คํ…์ฒ˜ ๋ฐ˜์˜์€ GF-134๊ฐ€ ๊ณ„์† ๋งก๋Š”๋‹ค. + + +## Acceptance Criteria + +- [x] #1 ์ตœ์ข…์ ์œผ๋กœ ์™„์„ฑ๋˜๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ „๋ฌธ์„ ๋ฌธ์„œ ์•ž๋ถ€๋ถ„์— ์ œ์‹œํ•œ๋‹ค โ€” ์ œ๋ชฉยท๋ณธ๋ฌธยทfooter๊ฐ€ ๋ชจ๋‘ ์ฑ„์›Œ์ง„ ์‹ค์ œ ์˜ˆ์‹œ ํ•˜๋‚˜ +- [x] #2 ๊ฐ ํ•„๋“œ๋ฅผ ํ‘œ๋กœ ์ •๋ฆฌํ•œ๋‹ค: ์ œ๋ชฉ ๊ตฌ์„ฑ์š”์†Œ(type, subsystem, ์„ค๋ช…)์™€ ํŠธ๋ ˆ์ผ๋Ÿฌ ์ „์ฒด +- [x] #3 ํ‘œ์— ๊ฐ ํ•„๋“œ์˜ ์˜๋ฏธ, ์–ธ์ œ(์–ด๋А ํ›…์˜ ์–ด๋А ์‹œ์ ) ๋งŒ๋“ค์–ด์ง€๋Š”์ง€, ์™œ ํ•„์š”ํ•œ์ง€๋ฅผ ํ•จ๊ป˜ ๋‹ด๋Š”๋‹ค +- [x] #4 ์‚ฌ๋žŒ์ด ์ง์ ‘ ์“ฐ๋Š” ํ•„๋“œ์™€ ํ›…์ด ์ž๋™์œผ๋กœ ๋ถ™์ด๋Š” ํ•„๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•ด ํ‘œ์‹œํ•œ๋‹ค +- [x] #5 ๊ฐ’์˜ ์‹ ๋ขฐ ์ˆ˜์ค€(๊ฐ•์ œ/์„œ๋ฒ„ ๋ฐœ๊ธ‰/์ž๊ฐ€์‹ ๊ณ /์ž๋™)์„ ํ‘œ์— ์œ ์ง€ํ•œ๋‹ค โ€” ๊ธฐ์กด ํŠธ๋ ˆ์ผ๋Ÿฌ ํ‘œ์˜ ํ•ต์‹ฌ ์ •๋ณด๋‹ค +- [x] #6 GF-135๊ฐ€ ๋Š˜๋ฆฐ ๋ถ„๋Ÿ‰์„ ์••์ถ•ํ•œ๋‹ค: ์–ธ์–ด lint ๋ฒ”์œ„ ์„ค๋ช…, ์ปจ์Šˆ๋จธ ํ•œ๊ณ„ ์ธ์šฉ ๋ธ”๋ก, prepare-commit-msg ์ค‘์ฒฉ ๋ถˆ๋ฆฟ, ์žฌ์„ค๊ณ„ ์ง„ํ–‰ ์•Œ๋ฆผ ๋ธ”๋ก +- [x] #7 ์ƒˆ ์„ค๋ช…์„ ๋ณดํƒœ์ง€ ์•Š๋Š”๋‹ค โ€” ๊ธฐ์กด ๋‚ด์šฉ์˜ ์žฌ๋ฐฐ์น˜์™€ ์••์ถ•๋งŒ ํ•œ๋‹ค +- [x] #8 '์–ธ์ œ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€'๋Š” ํ˜„์žฌ ์‚ฌ์‹ค๋Œ€๋กœ ์“ด๋‹ค (ํŠธ๋ ˆ์ผ๋Ÿฌ ์‚ฝ์ž…์€ post-commit, ๋ฉ”์‹œ์ง€ ๊ฒ€์ฆ์€ commit-msg). GF-127/128์ด ์˜ฎ๊ธฐ๋ฉด ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ํƒœ์Šคํฌ ๋…ธํŠธ์— ๋‚จ๊ธด๋‹ค +- [x] #9 README ์ˆœ์ฆ ์ค„ ์ˆ˜๊ฐ€ 0 ์ดํ•˜๋‹ค (GF-135 ์ด์ „ ๋Œ€๋น„) +- [x] #10 ํ•„๋“œ ํ‘œ์— ๊ทธ ํ•„๋“œ๋ฅผ ๋งŒ๋“œ๋Š” git ํ›… ์ด๋ฆ„์„ ๋ช…์‹œํ•œ๋‹ค (prepare-commit-msg / commit-msg / post-commit ์ค‘ ์–ด๋А ๊ฒƒ์ธ์ง€) +- [x] #11 git ์ปค๋ฐ‹ ํ›… ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๋ฌธ์„œ์— ํ•จ๊ป˜ ์ •๋ฆฌํ•œ๋‹ค โ€” ์ปค๋ฐ‹ ํ•œ ๋ฒˆ์— ํ›…์ด ๋„๋Š” ์ˆœ์„œ์™€ ๊ฐ ๋‹จ๊ณ„์—์„œ ์ปค๋ฐ‹ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€ +- [x] #12 ๋ผ์ดํ”„์‚ฌ์ดํด์—์„œ --no-verify๊ฐ€ ์–ด๋А ํ›…์„ ๊ฑด๋„ˆ๋›ฐ๋Š”์ง€ ํ‘œ์‹œํ•œ๋‹ค โ€” ์–ด๋–ค ํ•„๋“œ๊ฐ€ ์šฐํšŒ ๊ฐ€๋Šฅํ•˜๊ณ  ์–ด๋–ค ํ•„๋“œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ์ง€๊ฐ€ ์—ฌ๊ธฐ์„œ ๊ฐˆ๋ฆฐ๋‹ค + + +## Definition of Done + +- [x] #1 python3 -m unittest ์Šค์œ„ํŠธ ์ „์ฒด ํ†ต๊ณผ +- [x] #2 ๋ฌธ์„œ์— ์ ํžŒ ์ปค๋ฐ‹ ์˜ˆ์‹œ๊ฐ€ ์‹ค์ œ๋กœ ์ƒ์„ฑ๋˜๋Š” footer์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ + + +## Implementation Notes + + +## ์ฃผ์˜: '์–ธ์ œ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€' ์—ด์€ ์ง€๊ธˆ ์‚ฌ์‹ค์ด๊ณ  ๊ณง ๋ฐ”๋€๋‹ค + +ํ˜„์žฌ ๊ตฌ์กฐ๋Š” ์žฌ์„ค๊ณ„ ์ค‘์ด๋‹ค. ํŠธ๋ ˆ์ผ๋Ÿฌ ์‚ฝ์ž…์€ ์•„์ง post-commit์ด ํ•˜๊ณ (git commit --amend), ๋ฉ”์‹œ์ง€ ๊ฒ€์ฆ์€ ์•„์ง commit-msg๊ฐ€ ํ•œ๋‹ค. ํ‘œ์˜ '์–ธ์ œ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€' ์—ด์€ **ํ˜„์žฌ ์‚ฌ์‹ค๋Œ€๋กœ** ์“ด๋‹ค. + +GF-127์ด ๊ฒ€์ฆ์„, GF-128์ด ํŠธ๋ ˆ์ผ๋Ÿฌ ์‚ฝ์ž…์„ prepare-commit-msg๋กœ ์˜ฎ๊ธฐ๋ฉด ๊ทธ ์—ด์„ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค. GF-134๊ฐ€ ์ตœ์ข… ์•„ํ‚คํ…์ฒ˜ ๋ฐ˜์˜๊ณผ hooks/README.md๋ฅผ ๋งก๋Š”๋‹ค. + + +## Final Summary + + +README๋ฅผ ๊ตฌํ˜„ ์„œ์ˆ ์—์„œ **์ตœ์ข… ์‚ฐ์ถœ๋ฌผ ์ค‘์‹ฌ**์œผ๋กœ ์žฌ๊ตฌ์„ฑํ–ˆ๋‹ค. 203์ค„ โ†’ 163์ค„(GF-135๊ฐ€ ๋Š˜๋ฆฐ 7์ค„๊นŒ์ง€ ํฌํ•จํ•ด 40์ค„ ๊ฐ์†Œ). + +## ๊ตฌ์กฐ + +1. **์™„์„ฑ๋˜๋Š” ์ปค๋ฐ‹ ์˜ˆ์‹œ** โ€” ์ œ๋ชฉยท๋ณธ๋ฌธยทfooter๊ฐ€ ๋ชจ๋‘ ์ฑ„์›Œ์ง„ ์‹ค์ œ ์ปค๋ฐ‹ ํ•˜๋‚˜. ์‚ฌ๋žŒ์ด ์“ฐ๋Š” ๋ถ€๋ถ„๊ณผ ํ›…์ด ๋ถ™์ด๋Š” ๋ถ€๋ถ„์„ ํ™”์‚ดํ‘œ๋กœ ๊ตฌ๋ถ„ +2. **ํ•„๋“œ ํ‘œ 2๊ฐœ** โ€” ์ œ๋ชฉยท๋ณธ๋ฌธ(์‚ฌ๋žŒ์ด ์”€, ๊ทœ์น™ ํฌํ•จ)๊ณผ ํŠธ๋ ˆ์ผ๋Ÿฌ(ํ›…์ด ๋ถ™์ž„). ๊ฐ ํ•„๋“œ์˜ ์˜๋ฏธยท์™œ ํ•„์š”ํ•œ๊ฐ€ยท๋งŒ๋“œ๋Š” ํ›…ยท๊ฐ’์˜ ์ถœ์ฒ˜ยท์‹ ๋ขฐ ์ˆ˜์ค€ +3. **ํ›… ๋ผ์ดํ”„์‚ฌ์ดํด ํ‘œ** โ€” ์ปค๋ฐ‹ ๊ฒฝ๋กœ๋งŒ, ์ปค๋ฐ‹ ๊ฐ์ฒด ์กด์žฌ ์—ฌ๋ถ€์™€ `--no-verify` ์Šคํ‚ต ์—ฌ๋ถ€๋ฅผ ์—ด๋กœ +4. **๋ฒ”์œ„** โ€” lint ์ œ์™ธ์™€ ์ปจ์Šˆ๋จธ ํ•œ๊ณ„๋ฅผ ํ•œ ๋ฌธ๋‹จ์œผ๋กœ ์••์ถ• + +## ๋ผ์ดํ”„์‚ฌ์ดํด ํ‘œ๊ฐ€ ์„ค๊ณ„๋ฅผ ์„ค๋ช…ํ•œ๋‹ค + +ํ‘œ์— '์ปค๋ฐ‹ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”๊ฐ€'์™€ '--no-verify๋กœ ๊ฑด๋„ˆ๋›ฐ๋‚˜' ์—ด์„ ๋„ฃ์œผ๋‹ˆ ์„ค๊ณ„์˜ ๋‘ ํ•ต์‹ฌ์ด ํ‘œ์—์„œ ๋ฐ”๋กœ ์ฝํžŒ๋‹ค โ€” ์—๋””ํ„ฐ๊ฐ€ `prepare-commit-msg`๋ณด๋‹ค **๋’ค**์— ์—ด๋ ค์„œ ๊ทธ ํ›…์€ ์ตœ์ข… ๋ฉ”์‹œ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ(๊ทธ๋ž˜์„œ ์—๋””ํ„ฐ ๊ฒฝ๋กœ๋ฅผ ๊ฑฐ๋ถ€ํ•œ๋‹ค), ๊ทธ๋ฆฌ๊ณ  4๋‹จ๊ณ„์—์„œ ์ปค๋ฐ‹์ด ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง€๋ฏ€๋กœ `post-commit`์€ ์ปค๋ฐ‹์„ ๋ง‰์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ(๊ทธ๋ž˜์„œ ๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐ๋ก๋งŒ ํ•œ๋‹ค). + +28ํ–‰์งœ๋ฆฌ ์ „์ฒด ํ›… ๋ชฉ๋ก์€ ์ปค๋ฐ‹ ๊ฒฝ๋กœ 5ํ–‰์œผ๋กœ ์ค„์˜€๋‹ค. ๋‚˜๋จธ์ง€ 23ํ–‰์€ ์ „๋ถ€ 'โ€”'์˜€๊ณ , git-format์ด ์ปค๋ฐ‹ ๋‹จ๊ณ„๋งŒ ๋‹ค๋ฃฌ๋‹ค๋Š” ์›์น™์€ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค. + +## ์••์ถ•ํ•œ ๊ฒƒ + +GF-135๊ฐ€ ๋Š˜๋ฆฐ ๋„ค ๊ณณ์„ ๊ฑท์–ด๋ƒˆ๋‹ค โ€” ์–ธ์–ด lint ๋ฒ”์œ„ ์„ค๋ช… ๋‘ ๋ฌธ๋‹จ, ์ปจ์Šˆ๋จธ ํ•œ๊ณ„ ์ธ์šฉ ๋ธ”๋ก, `prepare-commit-msg` ์ค‘์ฒฉ ๋ถˆ๋ฆฟ, ์žฌ์„ค๊ณ„ ์ง„ํ–‰ ์•Œ๋ฆผ ๋ธ”๋ก. ์‚ฌ์‹ค์€ ์†์‹ค๋˜์ง€ ์•Š์•˜๋‹ค(์—†์–ด์ง„ ์ •๋ณด๋Š” decision-18/23๊ณผ doc-15์— ์ด๋ฏธ ์žˆ๋‹ค). + +## ์˜ˆ์‹œ๋ฅผ ์‹ค์ œ ๊ฐ’์œผ๋กœ ๊ฒ€์ฆํ–ˆ๋‹ค + +์ฒ˜์Œ ์ดˆ์•ˆ์— `AI-Agent: claude-code/2.1.267 (claude-opus-5)`๋ฅผ ์ผ๋Š”๋ฐ **๊ทธ๊ฑด GF-128 ์˜ˆ์ •์ด๊ณ  ํ˜„์žฌ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋‹ค.** ์‹ค์ œ footer๋Š” ์•„์ง `AI-Tool`/`AI-Tool-Version`/`AI-Model` ์„ธ ์ค„๋กœ ๋‚˜๋‰˜์–ด ์žˆ๋‹ค. ์ž๊ธฐ ์ปค๋ฐ‹์˜ footer๋ฅผ ๋ฝ‘์•„ ๋Œ€์กฐํ•ด ์ •์ •ํ–ˆ๋‹ค. + +## ๊ฐฑ์‹ ์ด ํ•„์š”ํ•œ ์‹œ์  + +ํ‘œ์˜ '๋งŒ๋“œ๋Š” ํ›…' ์—ด์ด ํ˜„์žฌ ์ „๋ถ€ `post-commit`์ด๋‹ค. GF-127์ด ๊ฒ€์ฆ์„, GF-128์ด ํŠธ๋ ˆ์ผ๋Ÿฌ ์‚ฝ์ž…์„ `prepare-commit-msg`๋กœ ์˜ฎ๊ธฐ๋ฉด ์ด ์—ด๊ณผ ๋ผ์ดํ”„์‚ฌ์ดํด ํ‘œ๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค. GF-134๊ฐ€ ์ตœ์ข… ์•„ํ‚คํ…์ฒ˜ ๋ฐ˜์˜๊ณผ `hooks/README.md`๋ฅผ ๋งก๋Š”๋‹ค. +