Devops/Git

[Git] submodule / subtree

yuri lee 2024. 1. 22. 22:12
λ°˜μ‘ν˜•

Intro

μ•ˆλ…•ν•˜μ„Έμš”. 이번 μ‹œκ°„μ—λŠ” git submodule / subtree 에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. 

 

submodule

 

# Goal

ν•˜λ‚˜ μ΄μƒμ˜ μ™ΈλΆ€ μ €μž₯μ†Œ (git μ €μž₯μ†Œ)λ₯Ό ν˜„μž¬ ν”„λ‘œμ νŠΈμ— ν¬ν•¨μ‹œν‚€κΈ° μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€. 

 

# How to work

λΆ€λͺ¨ μ €μž₯μ†Œ(repository)λŠ” μ„œλΈŒλͺ¨λ“ˆμ΄λΌ λΆˆλ¦¬λŠ” λ³„λ„μ˜ μ €μž₯μ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” λ§ν¬λ§Œμ„ μœ μ§€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 μ €μž₯μ†ŒλŠ” 자체적으둜 독립적인 Git μ €μž₯μ†Œλ‘œμ„œ κ΄€λ¦¬λ˜λ©°, λΆ€λͺ¨ μ €μž₯μ†Œμ—λŠ” ν•΄λ‹Ή μ„œλΈŒλͺ¨λ“ˆμ˜ μƒνƒœ(컀밋 ν•΄μ‹œ)λ§Œμ„ κΈ°λ‘ν•©λ‹ˆλ‹€.

 

# Usage

μ„œλΈŒλͺ¨λ“ˆ μΆ”κ°€: git submodule add <repository-url> <path> 

λΆ€λͺ¨ μ €μž₯μ†Œμ—μ„œ μ„œλΈŒλͺ¨λ“ˆ μ—…λ°μ΄νŠΈ: git submodule update --init --recursive

 

subtree

# Goal

μ™ΈλΆ€ μ €μž₯μ†Œμ˜ 일뢀 λ˜λŠ” 전체λ₯Ό ν˜„μž¬ ν”„λ‘œμ νŠΈμ˜ μ„œλΈŒλ””λ ‰ν† λ¦¬μ— ν†΅ν•©μ‹œν‚€κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

 

#How to work

μ™ΈλΆ€ μ €μž₯μ†Œμ˜ νŠΉμ • 디렉토리λ₯Ό ν˜„μž¬ μ €μž₯μ†Œλ‘œ κ°€μ Έμ˜€λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€. μ΄λŠ” μ™ΈλΆ€ μ €μž₯μ†Œμ˜ νŠΉμ • 컀밋 이λ ₯을 ν˜„μž¬ μ €μž₯μ†Œμ˜ ν•˜λ‚˜μ˜ μ»€λ°‹μœΌλ‘œ ν†΅ν•©ν•©λ‹ˆλ‹€.

 

#Usage

μ™ΈλΆ€ μ €μž₯μ†Œμ˜ νŠΉμ • λ””렉토리 κ°€μ Έμ˜€κΈ°: git subtree add --prefix <prefix> <repository-url> <branch> 

μ„œλΈŒνŠΈλ¦¬ μ—…λ°μ΄νŠΈ: git subtree pull --prefix <prefix> <repository-url> <branch>

 

Example

 

#git submodule을 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 경우

1. μ™ΈλΆ€ 라이브러리 λ˜λŠ” ν”„λ‘œμ νŠΈμ˜ νŠΉμ • 버전을 μ •ν™•ν•˜κ²Œ ν¬ν•¨μ‹œν‚€κ³ μž ν•  λ•Œ: 예λ₯Ό λ“€μ–΄, ν”„λ‘œμ νŠΈκ°€ μ™ΈλΆ€ 라이브러리의 νŠΉμ • 버전에 μ˜μ‘΄ν•˜κ³  μžˆμ„ λ•Œ, ν•΄λ‹Ή λ²„μ „μ˜ μ½”λ“œλ₯Ό μ„œλΈŒλͺ¨λ“ˆλ‘œ μΆ”κ°€ν•˜μ—¬ μ™ΈλΆ€ 라이브러리의 μ—…λ°μ΄νŠΈμ— 영ν–₯을 받지 μ•Šλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# μ˜ˆμ‹œ: μ™ΈλΆ€ 라이브러리의 νŠΉμ • 버전을 ν”„λ‘œμ νŠΈμ— 포함
git submodule add https://github.com/example/library.git external/library

 

2. μ—¬λŸ¬ ν”„λ‘œμ νŠΈμ—μ„œ κ³΅μœ λ˜λŠ” μ½”λ“œλ₯Ό μœ μ§€ 및 관리할 λ•Œ: μ—¬λŸ¬ ν”„λ‘œμ νŠΈμ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©λ˜λŠ” μ½”λ“œλ₯Ό 독립적인 μ €μž₯μ†Œλ‘œ μœ μ§€ν•˜κ³ , 각 ν”„λ‘œμ νŠΈμ—μ„œλŠ” 이 μ½”λ“œλ₯Ό μ„œλΈŒλͺ¨λ“ˆλ‘œ μΆ”κ°€ν•˜μ—¬ 쀑볡을 λ°©μ§€ν•˜κ³  κ΄€λ¦¬μ˜ μš©μ΄μ„±μ„ 확보할 수 μžˆμŠ΅λ‹ˆλ‹€.

# μ˜ˆμ‹œ: μ—¬λŸ¬ ν”„λ‘œμ νŠΈμ—μ„œ κ³΅μœ λ˜λŠ” μ½”λ“œλ₯Ό μ„œλΈŒλͺ¨λ“ˆλ‘œ μΆ”κ°€
git submodule add https://github.com/example/common-code.git common-code

 


#git subtreeλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 경우

1. λ‹€λ₯Έ ν”„λ‘œμ νŠΈμ˜ μΌλΆ€ μ½”λ“œλ₯Ό ν˜„μž¬ ν”„λ‘œμ νŠΈμ— ν†΅ν•©ν•  λ•Œ: νŠΉμ • μ™ΈλΆ€ ν”„λ‘œμ νŠΈμ˜ νŠΉμ • λ””λ ‰ν† λ¦¬λ§Œμ„ ν˜„μž¬ ν”„λ‘œμ νŠΈμ— ν†΅ν•©ν•˜κ³ μž ν•  λ•Œ, git subtreeλ₯Ό μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

# μ˜ˆμ‹œ: μ—¬λŸ¬ ν”„λ‘œμ νŠΈμ—μ„œ κ³΅μœ λ˜λŠ” μ½”λ“œλ₯Ό μ„œλΈŒλͺ¨λ“ˆλ‘œ μΆ”κ°€
git submodule add https://github.com/example/common-code.git common-code

 

2. μ—¬λŸ¬ ν”„λ‘œμ νŠΈ κ°„에 μ½”λ“œλ₯Ό κ³΅μœ ν•˜λ©΄μ„œλ„ κ°κ°μ˜ ν”„λ‘œμ νŠΈμ—μ„œ μ½”λ“œμ˜ μΌλΆ€λΆ„λ§Œ μ‚¬μš©ν•˜κ³ μž ν•  λ•Œ: μ„œλΈŒνŠΈλ¦¬λ₯Ό μ‚¬μš©ν•˜μ—¬ μ™ΈλΆ€ ν”„λ‘œμ νŠΈμ˜ νŠΉμ • λ””λ ‰ν† λ¦¬λ§Œμ„ ν˜„μž¬ ν”„λ‘œμ νŠΈλ‘œ κ°€μ Έμ™€μ„œ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

# μ˜ˆμ‹œ: μ—¬λŸ¬ ν”„λ‘œμ νŠΈ 간에 μ½”λ“œλ₯Ό κ³΅μœ ν•˜λ©΄μ„œ 각각의 ν”„λ‘œμ νŠΈμ—μ„œ μ½”λ“œμ˜ μΌλΆ€λΆ„λ§Œ μ‚¬μš©
git subtree add --prefix common-code https://github.com/example/common-code.git main

 

differences between git submodule and git subtree

  • Relationship with External Repositories
    • git submodule: 각 μ„œλΈŒλͺ¨λ“ˆμ— λŒ€ν•΄ 별도이며 독립적인 Git μ €μž₯μ†Œλ₯Ό μœ μ§€ν•©λ‹ˆλ‹€. λΆ€λͺ¨ μ €μž₯μ†ŒλŠ” μ„œλΈŒλͺ¨λ“ˆμ˜ νŠΉμ • 컀밋을 μ°Έμ‘°ν•©λ‹ˆλ‹€.
    • git subtree: μ™ΈλΆ€ μ €μž₯μ†Œμ˜ λ‚΄μš©μ„ μ£Ό μ €μž₯μ†Œμ˜ ν•˜μœ„ λ””λ ‰ν„°λ¦¬λ‘œ κ°€μ Έμ™€, μ™ΈλΆ€ μ €μž₯μ†Œλ₯Ό μ£Ό μ €μž₯μ†Œμ— λ³‘ν•©ν•©λ‹ˆλ‹€.
  • Independence
    • git submodule: μ„œλΈŒλͺ¨λ“ˆμ€ λ…λ¦½λœ μ €μž₯μ†Œμž…λ‹ˆλ‹€. μ„œλΈŒλͺ¨λ“ˆ λ‚΄μ˜ λ³€κ²½μ‚¬ν•­μ€ λ³„λ„λ‘œ μΆ”μ λ˜λ©°, λΆ€λͺ¨ μ €μž₯μ†Œμ—μ„œλŠ” λͺ…μ‹œμ μœΌλ‘œ μ„œλΈŒλͺ¨λ“ˆμ˜ μƒˆλ‘œμš΄ μ»€λ°‹μœΌλ‘œ μ—…λ°μ΄νŠΈν•΄μ•Ό ν•©λ‹ˆλ‹€.
      git subtree: μ™ΈλΆ€ μ €μž₯μ†Œμ˜ μ½”λ“œλŠ” μ£Ό μ €μž₯μ†Œμ˜ μΌλΆ€κ°€ λ˜λ©°, κ°€μ Έμ˜¨ μ½”λ“œλŠ” μ£Ό μ €μž₯μ†Œ λ‚΄μ—μ„œ μ§μ ‘ μ»€λ°‹λ˜κ³  μΆ”μ λ©λ‹ˆλ‹€
  • Ease of Use
    • git submodule: μ„œλΈŒλͺ¨λ“ˆμ„ μ΄ˆκΈ°ν™”ν•˜κ³  μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄ μΆ”가적인 λͺ…λ Ή(git submodule init, git submodule update)이 ν•„μš”ν•©λ‹ˆλ‹€. μ‚¬μš©μžλŠ” μ„œλΈŒλͺ¨λ“ˆ νŠΉν™” λͺ…령에 λŒ€ν•΄ μ•Œκ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
      git subtree: μ„œλΈŒνŠΈλ¦¬λŠ” μ£Ό μ €μž₯μ†Œ λ‚΄μ˜ λ‹€λ₯Έ λ””렉터리와 λ§ˆμ°¬κ°€μ§€λ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€. μ‚¬μš©μžλŠ” μ„œλΈŒλͺ¨λ“ˆ νŠΉν™” λͺ…령을 κ±±μ •ν•˜μ§€ μ•Šκ³  μ΅μˆ™ν•œ Git λͺ…λ Ήμ–΄λ‘œ μž‘μ—…ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
  • Workflow
    • git submodule: ν”„λ‘œμ νŠΈμ— μ™ΈλΆ€ μ½”λ“œλ₯Ό νŠΉμ • λ²„μ „μœΌλ‘œ κ²©λ¦¬λ˜κ³  λ²„μ „ κ΄€λ¦¬ν•˜κ³  μ‹Άμ„ λ•Œ μ£Όλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€. μ™ΈλΆ€ μ €μž₯μ†Œμ˜ νŠΉμ • λ²„전을 μΆ”μ ν•˜κ³ μž ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.
      git subtree: μ™ΈλΆ€ μ½”λ“œλ₯Ό ν”„λ‘œμ νŠΈμ˜ λ””렉터리 κ΅¬μ‘°μ˜ μΌλΆ€λ‘œ ν¬ν•¨ν•˜κ³ , μ΄λ₯Ό μ½”λ“œλ² μ΄μŠ€μ˜ μ€‘μš”ν•œ λΆ€λΆ„μœΌλ‘œ μ·¨κΈ‰ν•˜λ €λŠ” κ²½μš°μ— μ ν•©ν•©λ‹ˆλ‹€.
  • Complexity
    • git submodule: λ” μ •λ°€ν•œ μ œμ–΄μ™€ κ²©λ¦¬λ₯Ό μ œκ³΅ν•˜μ§€λ§Œ, μ„œλΈŒλͺ¨λ“ˆ μ΄ˆκΈ°ν™” λ° μ—…λ°μ΄νŠΈ ν•„μš”λ‘œ μΈν•΄ μ–΄λŠ μ •λ„μ˜ λ³΅μž‘성을 μΆ”κ°€ν•©λ‹ˆλ‹€.
      git subtree: μ™ΈλΆ€ μ½”λ“œλ₯Ό ν”„λ‘œμ νŠΈμ— λ” λ‹¨μˆœν•˜κ²Œ ν†΅ν•©ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©λ˜λ©°, μ„œλΈŒλͺ¨λ“ˆ νŠΉν™” λͺ…λ Ή μ—†μ΄λ„ μ΅μˆ™ν•œ Git λͺ…λ Ήμ–΄λ‘œ μž‘μ—…ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
λ°˜μ‘ν˜•