| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- kotlin algorithm
- ๋ฐฐ๋น์ฃผ
- ์๊ณ ๋ฆฌ์ฆ
- CI/CD
- kotlin ์๊ณ ๋ฆฌ์ฆ
- pnpm
- linux
- ๋ฏธ๊ตญ๋ฐฐ๋น์ฃผํฌ์
- ํ์ด์ฌ
- ๋ฐฑ์ค
- js
- ์๋ฐ ์๊ณ ๋ฆฌ์ฆ
- ์ฝํ๋ฆฐ ์๊ณ ๋ฆฌ์ฆ
- python
- GIT
- ์๋ฐ
- ์ฝํ๋ฆฐ ์คํ
- Kotlin
- Swift
- ํ๋ก๊ทธ๋๋จธ์ค
- Java
- ๋ฐฑ์ค ์ฝํ๋ฆฐ
- ํ์ฝํ
- Vue.js
- javascript
- ์๋ฐ์คํฌ๋ฆฝํธ
- java ์ฝ๋ฉ ํ ์คํธ
- ๋ฏธ๊ตญ์ฃผ์
- vue3
- ์ฝํ๋ฆฐ
- Today
- Total
๐ ์ ์ด์ ๋จธ๋ฆฟ์์ผ๋ก
[Git Hook] pre commit ์ผ๋ก ์ฅ์ ์๋ฐฉํ๊ธฐ(ft. husky, osascript) ๋ณธ๋ฌธ
[Git Hook] pre commit ์ผ๋ก ์ฅ์ ์๋ฐฉํ๊ธฐ(ft. husky, osascript)
Space_Jin 2024. 8. 29. 17:33d์ต์ ์ด์ ์ค์ธ ์ฑ์์ ํน์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค ์ฅ์ ๊ฐ ๋ฌ์๋ค.
์ผ๋ถ ์๋น์ค์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ ๋ฉ์๋๊ฐ ์์๋๋ฐ, ํ๊ฒฝ์ด ๋ถ์ฐ๋๊ณ ๋ณต์กํ๋ค๋ณด๋ ๊ฐ๋ฐ์๊ฐ ํ ์คํธ๋ฅผ ๋์น ์ผ์ด์ค์์๋ค.
์ด ๋ถ๋ถ์ ๊ฐ์ ํ๊ณ ๋น์ทํ ์ฅ์ ๋ฅผ ์๋ฐฉํ๊ธฐ ์ํด์ 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
Modern native Git hooks. Latest version: 9.1.5, last published: 9 days ago. Start using husky in your project by running `npm i husky`. There are no other projects in the npm registry using husky.
www.npmjs.com
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์ ์ ์ฉ์ํฌ ์ ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด์ ์ ๊ณตํ๋ค.
'Programming > Git' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Gitlab] ๊น ๋ฉ ๋ฏธ๋ฌ๋ง(gitlab mirroring, ๋ฐฑ์ ์ฒด๊ณ ๊ตฌ์ถ) (1) | 2025.01.24 |
|---|---|
| ๊นํ ํน์ ๋ธ๋์น ํด๋ก ํ๊ธฐ / github branch clone (0) | 2022.03.15 |