Skip to main content

์ค„ ๋์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก Git ๊ตฌ์„ฑ

diff์—์„œ์˜ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ค„ ๋์„ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก Git์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Platform navigation

์ค„ ๋ ์ •๋ณด

ํ‚ค๋ณด๋“œ์—์„œ return ํ‚ค๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์ค„ ๋์ด๋ผ๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ๋ฌธ์ž๊ฐ€ ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค. ์šด์˜ ์ฒด์ œ๋งˆ๋‹ค ์ค„ ๋์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Git๊ณผ GitHub๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ํ˜‘์—…ํ•  ๋•Œ, ์˜ˆ๋ฅผ ๋“ค์–ด Windows ๋จธ์‹ ์—์„œ ์ž‘์—… ์ค‘์ด๊ณ  ํ˜‘๋ ฅ์ž๊ฐ€ macOS์—์„œ ๋ณ€๊ฒฝํ•œ ๊ฒฝ์šฐ Git์—์„œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค„ ๋์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก Git์„ ๊ตฌ์„ฑํ•˜๋ฉด ๋‹ค๋ฅธ ์šด์˜ ์ฒด์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๊ณผ ํšจ๊ณผ์ ์œผ๋กœ ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค„ ๋์˜ ์ „์—ญ ์„ค์ •

git config core.autocrlf ๋ช…๋ น์€ Git์—์„œ ์ค„ ๋ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

macOS์—์„œ๋Š” ๊ตฌ์„ฑ์— input(์„)๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for macOS

Windows์—์„œ๋Š” ๊ตฌ์„ฑ์— true(์„)๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

$ git config --global core.autocrlf true
# Configure Git to ensure line endings in files you checkout are correct for Windows.
# For compatibility, line endings are converted to Unix style when you commit files.

Linux์—์„œ๋Š” ๊ตฌ์„ฑ์— input์„ ์ „๋‹ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

$ git config --global core.autocrlf input
# Configure Git to ensure line endings in files you checkout are correct for Linux

๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ณ„ ์„ค์ •

ํ•„์š”์— ๋”ฐ๋ผ .gitattributes ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜์—ฌ Git์ด ํŠน์ • ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ค„ ๋์„ ์ฝ๋Š” ๋ฐฉ๋ฒ•์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ปค๋ฐ‹ํ•˜๋ฉด ๋ชจ๋“  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ธฐ์—ฌ์ž์˜ core.autocrlf ์„ค์ •์ด ์žฌ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Git ์„ค์ • ๋ฐ ํ™˜๊ฒฝ์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ผ๊ด€๋œ ๋™์ž‘์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋ฃจํŠธ์— .gitattributes ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค๋ฅธ ํŒŒ์ผ์ฒ˜๋Ÿผ ์ปค๋ฐ‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

.gitattributes ํŒŒ์ผ์€ ๋‘ ๊ฐœ์˜ ์—ด์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

  • ์™ผ์ชฝ์—๋Š” Git์—์„œ ์ผ์น˜์‹œํ‚ฌ ํŒŒ์ผ ์ด๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ์—๋Š” Git์—์„œ ํ•ด๋‹น ํŒŒ์ผ์— ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ค„ ๋ ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ

.gitattributes ํŒŒ์ผ์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

ํŒŒ์ผ์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ผ์น˜๋œ ๋‹ค์Œ(*.c, *.sln, *.png), ์„ค์ •์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค(text, text eol=crlf, binary). ์•„๋ž˜์—์„œ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์„ค์ •์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • text=auto Git์€ ๊ฐ€์žฅ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ๊ธฐ๋ณธ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

  • text eol=crlf Git์€ ์ฒดํฌ ์•„์›ƒ ์‹œ ํ•ญ์ƒ ์ค„ ๋์„ CRLF(์œผ)๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. OSX ๋˜๋Š” Linux์—์„œ๋„ CRLF ๋์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ํŒŒ์ผ์— ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • text eol=lf Git์€ ์ฒดํฌ ์•„์›ƒ ์‹œ ํ•ญ์ƒ ์ค„ ๋์„ LF(์œผ)๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Windows์—์„œ๋„ LF ๋์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ํŒŒ์ผ์— ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • binary Git์€ ์ง€์ •๋œ ํŒŒ์ผ์ด ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ธ์‹ํ•˜๋ฏ€๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. binary ์„ค์ •์€ -text -diff์˜ ๋ณ„์นญ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ค„ ๋์„ ๋ณ€๊ฒฝํ•œ ํ›„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ƒˆ๋กœ ๊ณ ์นจ

core.autocrlf ์˜ต์…˜์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ .gitattributes ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•˜๋ฉด, Git์—์„œ ์ƒˆ ๊ตฌ์„ฑ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์ค„ ๋์„ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ •ํ•˜์ง€ ์•Š์€ ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ Git์—์„œ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋ชจ๋“  ์ค„ ๋์„ ์ƒˆ ๊ตฌ์„ฑ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด, Git์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋ฐฑ์—…ํ•œ ๋‹ค์Œ ๋ชจ๋“  ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋ณต์›ํ•˜์—ฌ ์ค„ ๋์„ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— Git์ด ๊ตฌ์„ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Git์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ํŒŒ์ผ์ด ํ…์ŠคํŠธ ๋˜๋Š” ์ด์ง„ ํŒŒ์ผ์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ด์ง„ ํŒŒ์ผ์ด ์†์ƒ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด .gitattributes์— ํŒŒ์ผ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ด์ง„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Git ์„ค๋ช…์„œ์˜ ๊ฒฝ๋กœ๋งˆ๋‹ค ํŠน์„ฑ ์ •์˜ - gitattributes๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  2. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋กœ์ปฌ ๋ณ€๊ฒฝ ๋‚ด์šฉ์˜ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฏธํ•ด๊ฒฐ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.

    Shell
    git add . -u
    git commit -m "Saving files before refreshing line endings"
    
  3. ์ƒˆ ๊ตฌ์„ฑ์„ ๋ฐ˜์˜ํ•˜๋„๋ก ํ˜„์žฌ ๋ถ„๊ธฐ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    Shell
    git add --renormalize .
    
  4. ์žฌ์ž‘์„ฑ๋œ ์ •๊ทœํ™”๋œ ํŒŒ์ผ์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    Shell
    git status
    
  5. ํ•„์š”์— ๋”ฐ๋ผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋ฏธํ•ด๊ฒฐ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์ปค๋ฐ‹ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    Shell
    git commit -m "Normalize all the line endings"
    

์ถ”๊ฐ€ ์ฐธ๊ณ  ์ž๋ฃŒ