GIT ์„œ๋ฒ„์— ๋Œ€ํ•œ ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ์•ก์„ธ์Šค ๊ตฌ์„ฑ

Git ์„œ๋ฒ„๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ตฌ์„ฑํ•  ๋•Œ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์˜ ์•ก์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜๋ฌธ์ด ์ƒ๊น๋‹ˆ๋‹ค. ์ €๋Š” ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌํ•œ ๊ฒฐ๊ณผ ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ „ํ•˜๋ฉฐ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ชจ๋“  ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๋‚ด ์†Œ์›์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ฐ ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์˜ ๊ณ„์ •์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋™์ผํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์ด ์ž‘์—…ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ์ข…์˜ ์›น ์ธํ„ฐํŽ˜์ด์Šค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ช…๋ น์ค„์„ ํ†ตํ•ด ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์ข‹์„ ๊ฒƒ์ด๋‹ค:

  • ํ†ต์ œํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ฝ๊ธฐ ์ „์šฉ ๊ถŒํ•œ ๋ถ€์—ฌ
  • Git์—์„œ ์‚ฌ์šฉ์ž ์ ‘๊ทผ ๊ถŒํ•œ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜์„ธ์š”

GIT ์„œ๋ฒ„ ์•ก์„ธ์Šค์— ๊ฐ€๋Šฅํ•œ ์˜ต์…˜ ๊ฐœ์š”

์šฐ์„  ๋ฌด์—‡์„ ์„ ํƒํ• ์ง€ ์•Œ์•„์•ผ ํ•˜๋ฏ€๋กœ Git ํ”„๋กœํ† ์ฝœ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ssh - ํŠน๋ณ„ํžˆ ์ƒ์„ฑ๋œ ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.
    • Git์ด ๋ชจ๋“  ์ €์žฅ์†Œ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋‚˜์˜ ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ ์‚ฌํ•ญ์—์„œ ์ œ์™ธํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ „ํ˜€ ์ถฉ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์—ฌ๋Ÿฌ ๊ณ„์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํŠน์ • ๋””๋ ‰ํ„ฐ๋ฆฌ์—๋งŒ ์‚ฌ์šฉ์ž ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
      • ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋‹ซ๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์“ฐ๊ธฐ ์•ก์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • Git์ด ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋งํฌ๋กœ ํ•ด์„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
      • ํ†ต์—ญ์‚ฌ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•ญ์ƒ ์ž‘๋™ํ•œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค.
        • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋Ÿฌํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์ž์ฒด ๋ช…๋ น ํ•ด์„๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ
          • ์ฒซ์งธ, ์ด๊ฒƒ์€ ์ด๋ฏธ ์ผ์ข…์˜ ์–ด๋ ค์šด ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค.
          • ๋‘˜์งธ, ์ด๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ช…๋ น์ด๋“  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„๊นŒ์š”?.. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋ฐฉ๋ฒ•์˜ ์‚ฌ์šฉ๋ฒ•์„ ์ •ํ™•ํžˆ ์•ˆ๋‹ค๋ฉด ์ด ๋ฐฉ๋ฒ•์„ ๋ฐฐ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒ ์ง€๋งŒ ์ง€๊ธˆ์€ ๋‹ค๋ฅธ ๋Œ€์•ˆ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋” ๊ฐ„๋‹จํ•œ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • git local ํ”„๋กœํ† ์ฝœ์€ sshfs์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์ „ ์‚ฌ๋ก€์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  • http - ์ฝ๊ธฐ ์ „์šฉ
  • git์€ ์ฝ๊ธฐ ์ „์šฉ์ž…๋‹ˆ๋‹ค
  • https - ์„ค์น˜๊ฐ€ ์–ด๋ ต๊ณ  ์ถ”๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ์•ก์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ผ์ข…์˜ ์ œ์–ดํŒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค... ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด ๋ณด์ด์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์ด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

SSH ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ Git ์„œ๋ฒ„์— ๋Œ€ํ•œ ๋‹ค์ค‘ ์‚ฌ์šฉ์ž ์•ก์„ธ์Šค ๊ตฌ์„ฑ

SSH ํ”„๋กœํ† ์ฝœ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Git์—์„œ๋Š” SSH ์ ‘์†์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ์˜ ๋ณด์•ˆ์„ ํ™•๋ณดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. SSH๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” Linux ์„œ๋ฒ„์—์„œ ์ž์‹ ์˜ ๋กœ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ SSH ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๊ณ  ์„œ๋ฒ„์˜ ๋ช…๋ น์ค„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌํ•œ ์•ก์„ธ์Šค์— ๋Œ€ํ•œ ์™„์ „ํ•œ ๋ณดํ˜ธ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž๋Š” Linux ํŒŒ์ผ์— ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ •๋ณด๋Š” git ์ €์žฅ์†Œ์—๋งŒ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ช…๋ น์ค„์„ ํ†ตํ•ด ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•˜์ง€ ์•Š๊ณ  Linux ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ฐธ์—ฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ™•์‹คํ•œ ์„ ํƒ์€ Linux ๊ถŒํ•œ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด SSH ์•ก์„ธ์Šค์—๋Š” ํ•˜๋‚˜์˜ ๊ณ„์ •๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์€ ๊ถŒ์žฅ๋˜๋Š” Git ์˜ต์…˜ ๋ชฉ๋ก์— ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ์‚ฌ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ œ๊ณต๋œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ถŒํ•œ ๋ฐ ์†Œ์œ ์ž ํ• ๋‹น์„ ํ†ตํ•ด ๋‹ค์Œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

1) ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
์–ด๋””์—์„œ
dir1, dir2, dir3 - ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ: ํ”„๋กœ์ ํŠธ 1, ํ”„๋กœ์ ํŠธ 2, ํ”„๋กœ์ ํŠธ 3.

proj1:proj1, proj2:proj2, proj3:proj3์€ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์†Œ์œ ์ž๋กœ ํ• ๋‹น๋œ ํŠน๋ณ„ํžˆ ์ƒ์„ฑ๋œ Linux ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ๊ถŒํ•œ์€ 0770์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์†Œ์œ ์ž์™€ ๊ทธ์˜ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์ „์ฒด ์•ก์„ธ์Šค ๊ถŒํ•œ๊ณผ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ๊ธˆ์ง€์ž…๋‹ˆ๋‹ค.

2) ๊ฐœ๋ฐœ์ž ๊ณ„์ •

ะ ะฐะทั€ะฐะฑะพั‚ั‡ะธะบ 1: dev1:dev1,proj1,proj2
ะ ะฐะทั€ะฐะฑะพั‚ั‡ะธะบ 2: dev2:dev2,proj2,proj3

ํ•ต์‹ฌ์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ ์‹œ์Šคํ…œ ์‚ฌ์šฉ์ž ์†Œ์œ ์ž์˜ ์ถ”๊ฐ€ ๊ทธ๋ฃน์ด ํ• ๋‹น๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” Linux ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž๊ฐ€ ํ•˜๋‚˜์˜ ๋ช…๋ น์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์—์„œ "๊ฐœ๋ฐœ์ž 1"์€ ํ”„๋กœ์ ํŠธ proj1 ๋ฐ proj2์—์„œ ์ž‘์—… ์ค‘์ด๊ณ  "๊ฐœ๋ฐœ์ž 2"๋Š” ํ”„๋กœ์ ํŠธ proj2 ๋ฐ proj3์—์„œ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž ์ค‘ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ช…๋ น์ค„์„ ํ†ตํ•ด ssh๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ, ์ฐธ์—ฌํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋‚ด์šฉ์„ ๋ณด๋Š” ๊ฒƒ์กฐ์ฐจ ๊ทธ๋“ค์˜ ๊ถŒํ•œ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์ด๊ฒƒ์„ ์Šค์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์›์น™์˜ ๊ทผ๊ฐ„์€ Linux ๊ถŒ๋ฆฌ์˜ ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ์ด๋ฏ€๋กœ ์ด ๋ฐฉ์‹์€ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๊ณ„ํš์€ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์—ฐ์Šตํ•˜๋Ÿฌ ๊ฐ€์ž.

Linux ์„œ๋ฒ„์—์„œ Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋งŒ๋“ค๊ธฐ

์šฐ๋ฆฌ๋Š” ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

[root@server ~]# cd /var/
[root@server var]# useradd gitowner
[root@server var]# mkdir gitservertest
[root@server var]# chown gitowner:gitowner gitservertest
[root@server var]# adduser proj1
[root@server var]# adduser proj2
[root@server var]# adduser proj3
[root@server var]# adduser dev1
[root@server var]# adduser dev2
[root@server var]# passwd dev1
[root@server var]# passwd dev2

์†์œผ๋กœ ํƒ€์ดํ•‘ํ•˜๊ธฐ ๊ท€์ฐฎ์•„์„œ..

[root@server gitservertest]# sed "s/ /n/g" <<< "proj1 proj2 proj3" | while read u; do mkdir $u; chown $u:$u $u; chmod 0770 $u; done

[root@server gitservertest]# usermod -aG proj1 dev1
[root@server gitservertest]# usermod -aG proj2 dev1
[root@server gitservertest]# usermod -aG proj2 dev2
[root@server gitservertest]# usermod -aG proj3 dev2

์šฐ๋ฆฌ๋Š” ๋ช…๋ น์ค„์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ, ์‹ฌ์ง€์–ด ๊ทธ ๋‚ด์šฉ์„ ๋ณด๋Š” ๊ฒƒ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

[dev1@server ~]$ cd /var/gitservertest/proj3
-bash: cd: /var/gitservertest/proj3: Permission denied
[dev1@server ~]$ ls /var/gitservertest/proj3
ls: cannot open directory /var/gitservertest/proj3: Permission denied

Git์˜ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž์™€ ๊ณต๋™์ž‘์—…

ํ•œ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ ํŒŒ์ผ์„ ๋„์ž…ํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋Š” ํ•ด๋‹น ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ฐœ๋ฐœ์ž ์ž์‹ ์ด ํ”„๋กœ์ ํŠธ์˜ ์‚ฌ์šฉ์ž ์†Œ์œ ์ž(์˜ˆ: proj1)๊ฐ€ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ํŒŒ์ผ์˜ ์†Œ์œ ์ž(์˜ˆ: dev1)์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ธก ์ €์žฅ์†Œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋จผ์ € ".git" ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€, ์ƒˆ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ Git ์ €์žฅ์†Œ ์ƒ์„ฑ ๋ฐ Git ์„œ๋ฒ„๋กœ ํ‘ธ์‹œ

ํด๋ผ์ด์–ธํŠธ ๋จธ์‹ ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

Microsoft Windows [Version 6.1.7601]
(c) ะšะพั€ะฟะพั€ะฐั†ะธั ะœะฐะนะบั€ะพัะพั„ั‚ (Microsoft Corp.), 2009. ะ’ัะต ะฟั€ะฐะฒะฐ ะทะฐั‰ะธั‰ะตะฝั‹.

C:gittest>git init .
Initialized empty Git repository in C:/gittest/.git/

C:gittest>echo "test dev1 to proj2" > test1.txt

C:gittest>git add .

C:gittest>git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   test1.txt

C:gittest>git commit -am "new test file added"
[master (root-commit) a7ac614] new test file added
 1 file changed, 1 insertion(+)
 create mode 100644 test1.txt
 
C:gittest>git remote add origin "ssh://[email protected]/var/gitservertest/proj2"

C:gittest>git push origin master
dev1:[email protected]'s password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 243 bytes | 243.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://10.1.1.11/var/gitservertest/proj2
 * [new branch]      master -> master

C:gittest>

๋™์‹œ์— ์„œ๋ฒ„์— ์ƒˆ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋ฉฐ ํ•ด๋‹น ํŒŒ์ผ์€ ํ‘ธ์‹œ๋ฅผ ์ˆ˜ํ–‰ํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์†ํ•ฉ๋‹ˆ๋‹ค.

[dev1@server proj2]$ tree
.
โ”œโ”€โ”€ 1.txt
โ”œโ”€โ”€ branches
โ”œโ”€โ”€ config
โ”œโ”€โ”€ description
โ”œโ”€โ”€ HEAD
โ”œโ”€โ”€ hooks
โ”‚   โ”œโ”€โ”€ applypatch-msg.sample
โ”‚   โ”œโ”€โ”€ commit-msg.sample
โ”‚   โ”œโ”€โ”€ post-update.sample
โ”‚   โ”œโ”€โ”€ pre-applypatch.sample
โ”‚   โ”œโ”€โ”€ pre-commit.sample
โ”‚   โ”œโ”€โ”€ prepare-commit-msg.sample
โ”‚   โ”œโ”€โ”€ pre-push.sample
โ”‚   โ”œโ”€โ”€ pre-rebase.sample
โ”‚   โ””โ”€โ”€ update.sample
โ”œโ”€โ”€ info
โ”‚   โ””โ”€โ”€ exclude
โ”œโ”€โ”€ objects
โ”‚   โ”œโ”€โ”€ 75
โ”‚   โ”‚   โ””โ”€โ”€ dcd269e04852ce2f683b9eb41ecd6030c8c841
โ”‚   โ”œโ”€โ”€ a7
โ”‚   โ”‚   โ””โ”€โ”€ ac6148611e69b9a074f59a80f356e1e0c8be67
โ”‚   โ”œโ”€โ”€ f0
โ”‚   โ”‚   โ””โ”€โ”€ 82ea1186a491cd063925d0c2c4f1c056e32ac3
โ”‚   โ”œโ”€โ”€ info
โ”‚   โ””โ”€โ”€ pack
โ””โ”€โ”€ refs
    โ”œโ”€โ”€ heads
    โ”‚   โ””โ”€โ”€ master
    โ””โ”€โ”€ tags

12 directories, 18 files
[dev1@server proj2]$ ls -l objects/75/dcd269e04852ce2f683b9eb41ecd6030c8c841
-r--r--r--. 1 dev1 dev1 54 Jun 20 14:34 objects/75/dcd269e04852ce2f683b9eb41ecd6030c8c841
[dev1@server proj2]$

Git ์„œ๋ฒ„์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์—…๋กœ๋“œํ•˜๋ฉด ์ถ”๊ฐ€ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ•ด๋‹น ์†Œ์œ ์ž๋Š” ์‹ค์ œ๋กœ ์—…๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ทธ๋ฃน์€ ์ด ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ ๊ทธ๋ฃน, ์ฆ‰ dev1 ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ dev1 ๊ทธ๋ฃน, dev2 ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ dev2 ๊ทธ๋ฃน์—๋„ ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค(๊ฐœ๋ฐœ์ž ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ ๊ทธ๋ฃน์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?). ์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž dev2๋Š” ์‚ฌ์šฉ์ž dev1์ด ๋งŒ๋“  ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ธฐ๋Šฅ์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Linux chown - ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ ์†Œ์œ ์ž ๋ณ€๊ฒฝ

ํŒŒ์ผ ์†Œ์œ ์ž๋Š” ์†Œ์œ ๊ถŒ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Š” ์ž์‹ ์—๊ฒŒ ์†ํ•œ ํŒŒ์ผ์˜ ๊ทธ๋ฃน์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋™์ผํ•œ ๊ทธ๋ฃน์— ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Git ํ›„ํฌ ์‚ฌ์šฉ

Hook์˜ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ›„ํฌ๋Š” ํ‘ธ์‹œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž ์•„๋ž˜์—์„œ ์‹คํ–‰๋˜๋Š” ์‹คํ–‰ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์•Œ๋ฉด ์šฐ๋ฆฌ๋Š” ๊ณ„ํš์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[dev1@server proj2]$ mv hooks/post-update{.sample,}
[dev1@server proj2]$ sed -i '2,$ s/^/#/' hooks/post-update
[dev1@server proj2]$ cat <<< 'find . -group $(whoami) -exec chgrp proj2 '"'"'{}'"'"' ;' >> hooks/post-update

์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ

vi hooks/post-update

ํด๋ผ์ด์–ธํŠธ ๋จธ์‹ ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

C:gittest>echo "dev1 3rd line" >> test1.txt

C:gittest>git commit -am "3rd from dev1, testing server hook"
[master b045e22] 3rd from dev1, testing server hook
 1 file changed, 1 insertion(+)

C:gittest>git push origin master
dev1:[email protected]'s password:
   d22c66e..b045e22  master -> master

Git ์„œ๋ฒ„์—์„œ๋Š” ์ปค๋ฐ‹ ํ›„ ํ›„ํฌ ์—…๋ฐ์ดํŠธ ํ›„ ์Šคํฌ๋ฆฝํŠธ์˜ ์ž‘๋™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

[dev1@server proj2]$ find . ! -group proj2

- ๋น„์–ด ์žˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

Git์—์„œ ๋‘ ๋ฒˆ์งธ ๊ฐœ๋ฐœ์ž ์—ฐ๊ฒฐ

๋‘ ๋ฒˆ์งธ ๊ฐœ๋ฐœ์ž์˜ ์ž‘์—…์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—์„œ

C:gittest>git remote remove origin

C:gittest>git remote add origin "ssh://[email protected]/var/gitservertest/proj2"

C:gittest>echo "!!! dev2 added this" >> test1.txt

C:gittest>echo "!!! dev2 wrote" > test2.txt

C:gittest>git add test2.txt

C:gittest>git commit -am "dev2 added to test1 and created test2"
[master 55d49a6] dev2 added to test1 and created test2
 2 files changed, 2 insertions(+)
 create mode 100644 test2.txt

C:gittest>git push origin master
[email protected]'s password:
   b045e22..55d49a6  master -> master

๋™์‹œ์— ์„œ๋ฒ„์—์„œ๋„...

[dev1@server proj2]$ find . ! -group proj2

โ€” ๋‹ค์‹œ ๋น„์šฐ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Git ํ”„๋กœ์ ํŠธ ์‚ญ์ œ ๋ฐ Git ์„œ๋ฒ„์—์„œ ํ”„๋กœ์ ํŠธ ๋‹ค์šด๋กœ๋“œ

๊ธ€์Ž„, ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ €์žฅ๋˜์—ˆ๋Š”์ง€ ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

C:gittest>rd /S /Q .
ะŸั€ะพั†ะตัั ะฝะต ะผะพะถะตั‚ ะฟะพะปัƒั‡ะธั‚ัŒ ะดะพัั‚ัƒะฟ ะบ ั„ะฐะนะปัƒ, ั‚ะฐะบ ะบะฐะบ ัั‚ะพั‚ ั„ะฐะนะป ะทะฐะฝัั‚ ะดั€ัƒะณะธะผ ะฟั€ะพั†ะตััะพะผ.

โ€” Git ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์™„์ „ํžˆ ์ง€์šฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฐธ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๋™์ž‘์ž…๋‹ˆ๋‹ค.

C:gittest>dir
 ะกะพะดะตั€ะถะธะผะพะต ะฟะฐะฟะบะธ C:gittest

21.06.2019  08:43    <DIR>          .
21.06.2019  08:43    <DIR>          ..

C:gittest>git clone ssh://[email protected]/var/gitservertest/proj2
Cloning into 'proj2'...
[email protected]'s password:

C:gittest>cd proj2

C:gittestproj2>dir
 ะกะพะดะตั€ะถะธะผะพะต ะฟะฐะฟะบะธ C:gittestproj2

21.06.2019  08:46    <DIR>          .
21.06.2019  08:46    <DIR>          ..
21.06.2019  08:46               114 test1.txt
21.06.2019  08:46                19 test2.txt
C:gittestproj2>type test1.txt
"test dev1 to proj2"
"dev1 added some omre"
"dev1 3rd line"
"!!! dev2 added this"

C:gittestproj2>type test2.txt
"!!! dev2 wrote"

Git์—์„œ ์•ก์„ธ์Šค ๊ณต์œ 

์ด์ œ ๋‘ ๋ฒˆ์งธ ๊ฐœ๋ฐœ์ž๊ฐ€ Git์„ ํ†ตํ•ด์„œ๋„ ์ž์‹ ์ด ์ž‘์—…ํ•˜์ง€ ์•Š๋Š” Proj1 ํ”„๋กœ์ ํŠธ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋„๋ก ํ•ฉ์‹œ๋‹ค.

C:gittestproj2>git remote remove origin

C:gittestproj2>git remote add origin "ssh://[email protected]/var/gitservertest/proj1"

C:gittestproj2>git push origin master
[email protected]'s password:
fatal: '/var/gitservertest/proj1' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

์ด์ œ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

[root@server ~]# usermod -aG proj1 dev2

๊ทธ ํ›„์—๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

C:gittestproj2>git push origin master
[email protected]'s password:
To ssh://10.1.1.11/var/gitservertest/proj1
 * [new branch]      master -> master

์ž์„ธํ•œ ๋‚ด์šฉ์€,

๋˜ํ•œ ํŒŒ์ผ ๋ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ ๊ถŒํ•œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ CentOS์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

setfacl -Rd -m o::5 -m g::7 /var/gitservertest

๋˜ํ•œ ๊ธฐ์‚ฌ์—์„œ ์ž‘์€ ์œ ์šฉํ•œ ๊ฒƒ๋“ค์„ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Linux์—์„œ ๋””๋ ‰ํ† ๋ฆฌ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
  • sed์˜ ์ฃผ์†Œ ๋ฒ”์œ„๋ฅผ ํŠน์ • ์ค„๋ถ€ํ„ฐ ํŒŒ์ผ ๋๊นŒ์ง€ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•, ์ฆ‰ ์ฒซ ๋ฒˆ์งธ ์ค„์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์ค„์„ sed์—์„œ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•
  • Linux find์—์„œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ๋ฐ˜์ „์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•
  • Linux ์…ธ์—์„œ ๋‹จ์ผ ๋ผ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ค„์„ ๋ฃจํ”„์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Bash์—์„œ ์ž‘์€๋”ฐ์˜ดํ‘œ๋ฅผ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Windows ๋ช…๋ น์ค„์—์„œ ๋ชจ๋“  ๋‚ด์šฉ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•
  • bash mv๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋‹ค์‹œ ์“ฐ์ง€ ์•Š๊ณ  ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

๊ด€์‹ฌ์„ ๊ฐ€์ ธ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€