[Git Hook] pre commit ์ผ๋ก ์ฅ์ ์๋ฐฉํ๊ธฐ(ft. husky, osascript)
d์ต์ ์ด์ ์ค์ธ ์ฑ์์ ํน์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค ์ฅ์ ๊ฐ ๋ฌ์๋ค.
์ผ๋ถ ์๋น์ค์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ ๋ฉ์๋๊ฐ ์์๋๋ฐ, ํ๊ฒฝ์ด ๋ถ์ฐ๋๊ณ ๋ณต์กํ๋ค๋ณด๋ ๊ฐ๋ฐ์๊ฐ ํ ์คํธ๋ฅผ ๋์น ์ผ์ด์ค์์๋ค.
์ด ๋ถ๋ถ์ ๊ฐ์ ํ๊ณ ๋น์ทํ ์ฅ์ ๋ฅผ ์๋ฐฉํ๊ธฐ ์ํด์ pre commit rule์ ์ถ๊ฐํด์ ํน์ ํค์๋๊ฐ ์์ค์ ์ถ๊ฐ๋๋ฉด ์๋ด๋ฅผ ์ํ ํ์ ์ ๋์ฐ๊ฒ ํ๋ค.
๐ค ํ๊ฒฝ
๊ฐ๋ฐํ์ ํ๊ฒฝ์ Mac์ ์ฌ์ฉํ๊ณ ์๊ณ Husky plugin์ด ์ค์น๋์ด ์์๋ค.
git์ ๊ฐ๋ฐ์๊ฐ commit์ ์ํํ๋ฉด, commit ์ด ์ํ๋๊ธฐ ์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ๋๊ฒ๋ํ๋ pre-commit ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๋ฐฉ๋ฒ์ ํ๋ก์ ํธ์ .git/ ํ์์ "pre-commit"์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
ํ์ง๋ง, git์์ ์ ๊ณตํ๋ pre-commit์ ๊ฒฝ์ฐ, ๊ฐ์ธ ๋ก์ปฌ์๋ง ์ ์ฉ๋๊ณ remote ํ๊ฒฝ์ ์ด์ฉํด์ ๊ฐ๋ฐ์๋ค์ด ๋ฐ๋ก ์ ์ฉํ๊ฒํ ์๋ ์์๋ค.
https://www.npmjs.com/package/husky
husky๋ฅผ ์ด์ฉํ๋ฉด, pre-commit์ ์์ฑํ๊ณ ๋ฐฐํฌํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ด์ ์ด์ฉํ๊ธฐ๋ก ์ด๋ฅผ ํ์ฉํ๊ธฐ๋ก ํ๋ค.
๐ Mac ํ์ ๋์๊ธฐ(osascript)
mac os์ ๊ฒฝ์ฐ, ์ ํ์์ ์ ๊ณตํ๋ osascript๋ฅผ ์ด์ฉํด์ ์๋์ด๋ ํ์ ์ ๋์ธ ์ ์๋ค.
$ osascript -e 'display dialog "ํ์
์ฐฝ ๋ฉ์ธ์ "'
ํ์ ์ฐฝ ๋์ฐ๊ธฐ
$ osascript -e 'display dialog "ํ์
์ฐฝ ๋ฉ์ธ์ " buttons{"์ปค์คํ
๋ฒํผ"}'
์ด๋ ๊ฒ ๋ฒํผ์ ์ปค์คํ ํ ์๋ ์๋ค.
$ osascript -e 'set keyword to "ํค์๋"' -e 'display dialog keyword & "๋ฅผ ์ฌ์ฉ" buttons{"์ปค์คํ
๋ฒํผ"}'
set ์์ฝ์ด๋ฅผ ์ฌ์ฉํด์ ๋ณ์๋ฅผ ์ง์ ํ ์๋ ์๋ค
์ ์์ค๋ keyword ๋ผ๋ ๋ณ์์ "ํค์๋"๋ผ๋ ๋ฌธ์์ด์ ํ ๋นํ ํ, display dialog ์์ฝ์ด๋ก ํ์ ์ฐฝ์ ๋์ ๋ค.
๐ Git diff๋ก ์์ ํ ์์ค์ ํค์๋ ์ถ๊ฐ ํ์ธํ๊ธฐ
git ํ๋ก์ ํธ์ git diff๋ฅผ ์ฌ์ฉํ๋ฉด ์์ค์ ๋ณํ๋ฅผ ํ์ธํ ์ ์๋ค.
์ด๋, ์ถ๊ฐ๋ line์ +๊ฐ ์ญ์ ๋ line์ -๊ฐ ๋งจ ์์ ๋ถ์ด์๋ค.
์ด๋ฅผ ํ์ฉํ๋ฉด, ํน์ ํค์๋๊ฐ ์์ค์ ์ถ๊ฐ๋์๋์ง ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
$ git diff --cached | grep -q "^\+.*${KEYWORD}"
--cached ์ต์ ์ ์คํ์ด์ง ์ํ(add ํ)๋ฅผ ํ์ธํ๊ณ grep์ -q ์ต์ ์ ์กด์ฌํ๋์ง true / false ๊ฒฐ๊ณผ๋ง returnํ๊ฒ ํด์ค๋ค.
-q ์ต์ ์ ์ ์ธํ๋ฉด, ํด๋น line์ ํฐ๋ฏธ๋์ ์ถ๋ ฅ ํด์ค๋ค.
์ด๋ฅผ ํ์ฉํ๋ฉด commit ์ ํน์ ํค์๋๋ฅผ ํ์ธํด์ ๋์ํ๋ pre-commit์ ๋ง๋ค ์ ์๋ค.
#!/usr/bin/env sh
KEYWORD="eval"
if git diff --cached | grep -q "^\+.*${KEYWORD}"; then
response=$(osascript -e 'set KW to "$KEYWORD"' -e 'display dialog KW & "๋ฅผ ์ถ๊ฐํ์
จ์ต๋๋ค." buttons{"ํ์ธ"}')
fi
exit 0
์ด๋ก์จ, ์์นซ ๊ฐ๋ฐ์๋ค์ด ๋์น ์ ์๋ ๋ถ๋ถ์ ํ๋ฒ ๋ ์ฑ๊ฒจ์ ์ฅ์ ์๋ฐฉ์ ๋์์ด๋ ์ ์์ง ์์๊น ์ถ๋ค.
์ฐธ๊ณ ๋ก husky๋ฅผ ํ์ฉํด์ ์์ ํ ์์ค๋ฅผ remote ํ๊ฒฝ์ ์ฌ๋ ค๋๋ฉด, ๊ฐ๋ฐ์๋ค์ด pullํด๊ฐ ์ ์์ง๋ง, .git/pre-commit์ ์์ฑํด์ผํ๋ค๋ฉด, ์์ค๋ฅผ ๊ฐ๋ฐ์๋ค์๊ฒ ์ ํํด์ ์ง์ ๋ก์ปฌ ํ๊ฒฝ์ ์ ์ฉ์ํค๊ฒ ํ๊ฑฐ๋ ํ ์ฌ๋์ด pre-commit ํ์ผ์ remote์ ์ฌ๋ฆฌ๊ณ ํด๋น ํ์ผ์ ์ง์ ์ ์ฉ์์ผ์ฃผ๋ ์คํฌ๋ฆฝํธ ๋ฑ์ ๋ง๋ค์ด์ ๊ฐ๋ฐ์๋ค์ ์์ค๋ฅผ pull ๋ฐ๊ณ ์คํฌ๋ฆฝํธ๋ง ์คํํ๋ฉด ์ ์ฉ๋ ์ ์๊ฒ ํด์ค์ผํ ๊ฒ ๊ฐ๋ค.
๋ด ๊ฒฝ์ฐ๋ ์ผ๋ถ repo์ ๊ฒฝ์ฐ husky๊ฐ ์กด์ฌํ์ง ์์์ ํ์์ ๋ฐฉ๋ฒ์ผ๋ก pre-commit์ ์ ์ฉ์ํฌ ์ ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด์ ์ ๊ณตํ๋ค.