Post

์œ ์šฉํ•œ shell script

๐ŸŽ€ Shell script

์‚ฌ์‹ค ๋‚˜๋Š” ์‰˜ ์Šคํฌ๋ฆฝํŠธ์— ๊ทธ๋‹ค์ง€ ์นœ์ˆ™ํ•œ ํŽธ์ด ์•„๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ ์ž์ฒด๊ฐ€ ๋„ˆ๋ฌด ํ•œ์ •์ ์ด๋ผ ๋”๋”์šฑ ๊ทธ๋ ‡๋‹ค.๐Ÿค”

๊ทธ๋Ÿฐ๋ฐ ์ตœ๊ทผ ์ด ์‰˜ ์Šคํฌ๋ฆฝํŠธ์˜ ์—„์ฒญ๋‚œ(!) ์‚ฌ์šฉ๋ฒ•์„ ๋ฐœ๊ฒฌํ–ˆ์œผ๋‹ˆ, ๋ฐ”๋กœ ๋‚ด๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊นƒ ๋ช…๋ น์–ด ๋ฌถ์Œ์„ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค! ์ด๊ฑธ ๋ชจ๋ฅด๋˜ ๋•Œ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ์ƒ๊ฐ์— ๋ธ”๋กœ๊ทธ์— ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

๐Ÿ‘€ Shell script๋ž€?

์‰˜ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ฉด์„œ ๋‚ด๊ฐ€ ํ˜ผ๋™ํ–ˆ๋˜ ๊ฐœ๋…์ด ์žˆ๋‹ค๋Š”๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค.

๋จผ์ € ์‰˜ ์Šคํฌ๋ฆฝํŠธ(Shell + Script)๋ผ๋Š” ์ด๋ฆ„๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž. Script๊ฐ€ ๋Œ€๋ณธ์ด๋ž€ ์˜๋ฏธ๊ฐ€ ์•„๋‹Œ๊ฐ€.

์ฆ‰ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ์‰˜์ด ํ–‰๋™ํ•  ๋‚ด์šฉ์ด ์ ํžŒ ์ผ์ข…์˜ ๋Œ€๋ณธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ์‰˜์€ ์‚ฌ์šฉ์ž์˜ ๋ช…๋ น์„ ๋ฐ›์•„ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ผ์ข…์˜ ๋ช…๋ น์–ด ํ•ด์„๊ธฐ๋‹ค.

๋ฆฌ๋ˆ…์Šค์™€ ์œ ๋‹‰์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ CLI(๋ฌธ์ž ์ž…๋ ฅ)์„ ํ†ตํ•ด ์šด์˜์ฒด์ œ(OS)๋ฅผ ์กฐ์ž‘ํ•˜๋ฏ€๋กœ ์ด๋Ÿฐ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์šด์˜์ฒด์ œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํ„ฐ๋ฏธ๋„์€ ๋ช…๋ น์–ด ์ž…๋ ฅ์ฐฝ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์ฐฝ๊ตฌ๋‹ค.

์ฆ‰ ์ด๋ฅผ ์ข…ํ•ฉํ•ด ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์‚ฌ์šฉ์ž๋Š” ํ„ฐ๋ฏธ๋„์„ ํ†ตํ•ด ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์‰˜์€ ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค!

์‰˜(๋ช…๋ น์–ด ํ•ด์„๊ธฐ)์—๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ ๋‚ด๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ Window์— ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒ‘์žฌ๋˜์–ด์žˆ๋Š” Power Shell ๊ณผ git์„ ์„ค์น˜ํ•˜๋ฉด์„œ ํ•จ๊ป˜ ์„ค์น˜ํ–ˆ๋˜ git bash๋ฅผ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ด ๋‘๊ฐ€์ง€๋Š” ๋ช…๋ น์–ด๋ฅผ ํ•ด์„ํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์–ด๋””์—์„œ๋Š” ์‹คํ–‰๋˜์—ˆ๋˜ ๋ช…๋ น์–ด๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ์ผ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

โœจ ํ•„์š”ํ•œ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑํ•˜๊ธฐ

๊ฐ„๋‹จํ•˜๊ฒŒ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด์•˜์œผ๋‹ˆ, ์ด์ œ ๋‚ด๊ฐ€ ์ž์ฃผ์“ฐ๋Š” ๊นƒ ๋ช…๋ น์–ด ๋ฌถ์Œ์„ ๋ชจ์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

์ผ๋‹จ ํ•„์š”ํ•œ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜๋ฅผ ๋‘๊ณ  ์—ฌ๋Ÿฌ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์ž‘์—…ํ•˜๋ฉด์„œ, main์ด๋‚˜ ๋‹ค๋ฅธ ๊ณณ์˜ ๋‚ด์šฉ์„ ํ•ด๋‹น branch์— merge ์‹œํ‚ฌ ํ•„์š”์„ฑ์ด ์žˆ๋Š”๋ฐ, ์ด ๋•Œ ํ˜„์žฌ ๋ธŒ๋žœ์น˜ ๋‚ด์šฉ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ–ˆ๋‹ค.

  1. ๊ธฐ์กด ๋ธŒ๋žœ์น˜(Origin) stash
  2. ํ•„์š”ํ•œ ๋ธŒ๋žœ์น˜(New)๋กœ switch
  3. ๋กœ์ปฌ์—์„œ remote branch ๋‚ด์šฉ pull
  4. ๋‹ค์‹œ ์›๋ž˜ ๋ธŒ๋žœ์น˜๋กœ switch
  5. New branch์™€ merge
  6. stash ํ•ด ๋‘” branch ๋‚ด์šฉ pop

์ด ๋•Œ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋‹จ์ถ•์–ด๋กœ ์ •๋ง ๋น ๋ฅด๊ฒŒ ์ด 6๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค!

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/bin/bash

# === ์„ค์ • ===
TARGET_BRANCH=${1:-main}

# === ํ˜„์žฌ ๋ธŒ๋žœ์น˜ ์ €์žฅ ===
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)

echo "๐Ÿ”„ ํ˜„์žฌ ๋ธŒ๋žœ์น˜: $CURRENT_BRANCH"
echo "๐Ÿ“ ๋ณ‘ํ•ฉ ๋Œ€์ƒ ๋ธŒ๋žœ์น˜: $TARGET_BRANCH"

# === ๋ณ€๊ฒฝ์‚ฌํ•ญ ์žˆ๋Š”์ง€ ํ™•์ธ ===
if ! git diff --quiet || ! git diff --cached --quiet; then
  echo "1๏ธโƒฃ  ๋ณ€๊ฒฝ์‚ฌํ•ญ stash ์ €์žฅ ์ค‘..."
  git stash push -m "auto-stash before merging $TARGET_BRANCH"
  STASHED=1
else
  echo "โœ… ๋ณ€๊ฒฝ์‚ฌํ•ญ ์—†์Œ (stash ์ƒ๋žต)"
  STASHED=0
fi

# === ๋ณ‘ํ•ฉ ๋Œ€์ƒ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ ===
echo "2๏ธโƒฃ  $TARGET_BRANCH ๋ธŒ๋žœ์น˜๋กœ ์ด๋™"
git checkout "$TARGET_BRANCH"

echo "3๏ธโƒฃ  ์ตœ์‹  ๋‚ด์šฉ pull"
git pull origin "$TARGET_BRANCH"

echo "4๏ธโƒฃ  ์›๋ž˜ ๋ธŒ๋žœ์น˜๋กœ ๋ณต๊ท€: $CURRENT_BRANCH"
git checkout "$CURRENT_BRANCH"

# === ๋ณ‘ํ•ฉ ===
echo "5๏ธโƒฃ  ์ตœ์‹  $TARGET_BRANCH ๋‚ด์šฉ๊ณผ ๋ณ‘ํ•ฉ"
git merge "$TARGET_BRANCH"

# === ์ถฉ๋Œ ์—ฌ๋ถ€ ํ™•์ธ ===
if [ $? -ne 0 ]; then
  echo "โŒ ๋ณ‘ํ•ฉ ์ค‘ ์ถฉ๋Œ ๋ฐœ์ƒ! ์ˆ˜๋™ ํ•ด๊ฒฐ ํ•„์š”"
  exit 1
fi

# === stash ๋ณต์› ===
if [ "$STASHED" -eq 1 ]; then
  echo "6๏ธโƒฃ stash ๋ณต์›ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (y/n)"
  read -r REPLY
  if [[ "$REPLY" =~ ^[Yy]$ ]]; then
    echo "โœ… stash ๋ณต์› ์ค‘..."
    git stash pop
  else
    echo "โ— stash๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š” ์‹œ 'git stash list' ํ™•์ธ"
  fi
fi

echo "๐ŸŽ‰ ๋ธŒ๋žœ์น˜ ์ตœ์‹ ํ™” ์™„๋ฃŒ!"

์ด์–ด์„œ remote branch๋ฅผ ๋กœ์ปฌ์— ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ฒƒ๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ”๊ฟ”๋ณด์ž

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
31
#!/bin/bash

# === ๋ธŒ๋žœ์น˜๋ช… ์ž…๋ ฅ๋ฐ›๊ธฐ ===
read -p "๐Ÿ” ๊ฐ€์ ธ์˜ฌ ๋ธŒ๋žœ์น˜๋ช…์„ ์ž…๋ ฅํ•˜์„ธ์š”: " BRANCH_NAME

# === ์ž…๋ ฅ ์—†์œผ๋ฉด ์ข…๋ฃŒ ===
if [ -z "$BRANCH_NAME" ]; then
  echo "โŒ ๋ธŒ๋žœ์น˜๋ช…์ด ์ž…๋ ฅ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค."
  exit 1
fi

echo "๐Ÿ“ ๋ธŒ๋žœ์น˜๋ช…: $BRANCH_NAME"

# === ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ ===
if git show-ref --verify --quiet refs/heads/$BRANCH_NAME; then
  echo "โœ… ์ด๋ฏธ ๋กœ์ปฌ์— ์กด์žฌํ•˜๋Š” ๋ธŒ๋žœ์น˜์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค."
  git checkout $BRANCH_NAME
else
  echo "๐Ÿ”„ ๋กœ์ปฌ์— ์—†๋Š” ๋ธŒ๋žœ์น˜์ž…๋‹ˆ๋‹ค. ์›๊ฒฉ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค..."
  git fetch origin $BRANCH_NAME

  # === fetch ์„ฑ๊ณต ์—ฌ๋ถ€ ํ™•์ธ ===
  if [ $? -ne 0 ]; then
    echo "โŒ ์›๊ฒฉ์— ์—†๋Š” ๋ธŒ๋žœ์น˜์ž…๋‹ˆ๋‹ค. ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
    exit 1
  fi

  # === ๋กœ์ปฌ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ + ํŠธ๋ž˜ํ‚น ์„ค์ • ===
  git checkout -b $BRANCH_NAME origin/$BRANCH_NAME
  echo "๐ŸŽ‰ ๋กœ์ปฌ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ๋ฐ ์ฒดํฌ์•„์›ƒ ์™„๋ฃŒ: $BRANCH_NAME"
fi

๋จผ์ €, ํ•ด๋‹น ๊ฒฝ๋กœ์— ์ž‘์„ฑํ•ด ๋‘” sh ํŒŒ์ผ์„ ๋„ฃ์–ด์ค€๋‹ค. D:\Users\(user_name)\scripts (scripts ํด๋”๋Š” ์ง์ ‘ ๋งŒ๋“  ํด๋”๋‹ค)

๊ทธ ๋‹ค์Œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹จ์ถ•์–ด๋กœ ๋“ฑ๋กํ•ด๋ณด์ž.

code ~/.bashrc ๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” bash ์„ค์ • ํŒŒ์ผ์„ vs code ์—๋””ํ„ฐ๋กœ ์˜คํ”ˆํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด alias๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

1
2
alias gr='bash ~/scripts/git-refresh.sh'
alias br='bash ~/scripts/git-branch.sh'

์ด์ œ ํ„ฐ๋ฏธ๋„์„ ๊ป๋‹ค๊ฐ€ ์ผœ์„œ bash ํ„ฐ๋ฏธ๋„์— gr ํ˜น์€ br ๋งŒ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ์œ„์—์„œ ์ž‘์„ฑํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜์–ด ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์›ํ•˜๋˜๋Œ€๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค!

๐ŸŽ vs code ๊ธฐ๋ณธ ํ„ฐ๋ฏธ๋„ ๋ฐ”๊พธ๊ธฐ

์ง€๊ธˆ๊นŒ์ง€ ๊ธฐ๋ณธ ํ„ฐ๋ฏธ๋„์„ Power shell์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, git bash์ผ ๋•Œ๋งŒ ์ด๋ฒˆ์— ์„ค์ •ํ•œ ๋‹จ์ถ•ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ธฐ๋ณธ ํ„ฐ๋ฏธ๋„์„ ๊ต์ฒดํ•ด์ฃผ์—ˆ๋‹ค.

ํ„ฐ๋ฏธ๋„ ๊ต์ฒด ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Ctrl + Shift + P
  2. Preference: Open User Settings(JSON) ํด๋ฆญ
  3. ์•„๋ž˜ ๋‚ด์šฉ ์ถ”๊ฐ€ํ•˜๊ธฐ
    1
    2
    3
    4
    5
    6
    
    "terminal.integrated.defaultProfile.windows": "Git Bash",
    "terminal.integrated.profiles.windows": {
     "Git Bash": {
       "path": "C:\\Program Files\\Git\\bin\\bash.exe"
     }
    }
    

    :star: ์ฐธ๊ณ ๋กœ, path๊ฐ’์€ ์–ด๋””์— Git์„ ์„ค์น˜ํ–ˆ๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ—‚๏ธ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

This post is licensed under CC BY 4.0 by the author.