iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
自我挑戰組

30天 Git 版本控制實戰筆記系列 第 17

Day 17:大型專案管理策略 - 管理複雜的程式碼庫

  • 分享至 

  • xImage
  •  

今日目標
• 學習管理大型專案的策略
• 理解 Git Submodules 的使用
• 掌握 Monorepo 的概念
• 學會優化大型 repository 效能
為什麼需要特殊策略?
小專案 vs 大型專案:
小專案(個人作品集):
├── index.html
├── style.css
└── script.js
→ 3 個檔案,簡單管理

大型專案(企業系統):
├── frontend/(1000+ 檔案)
├── backend/(2000+ 檔案)
├── mobile-app/(800+ 檔案)
├── shared-components/(500+ 檔案)
└── documentation/(300+ 檔案)
→ 4000+ 檔案,需要策略!
職場真實挑戰:
❌ 沒有策略的問題:

  • git clone 下載很久(幾 GB)
  • git status 跑很慢
  • 歷史記錄太多,難以查詢
  • 多個團隊互相干擾
  • 不知道誰負責哪個部分

✅ 有策略的解決:

  • 分模組管理,按需下載
  • 使用 shallow clone 加速
  • 清楚的目錄結構
  • 獨立的子專案
  • 明確的責任劃分

操作步驟
步驟1:理解專案結構策略
策略1:Monorepo(單一倉庫)
優點:
✅ 所有程式碼在一個 repo
✅ 容易跨專案重構
✅ 版本管理一致
✅ 共享工具和設定

缺點:
❌ Repository 可能很大
❌ Clone 時間長
❌ 權限管理複雜

適用:

  • 關聯性高的多個專案
  • 需要頻繁跨專案修改
  • Google, Facebook 使用此策略
    策略2:Multi-repo(多個倉庫)
    優點:
    ✅ 每個專案獨立
    ✅ 權限控制簡單
    ✅ Clone 速度快
    ✅ 團隊獨立開發

缺點:
❌ 跨專案修改困難
❌ 版本管理複雜
❌ 重複的設定檔

適用:

  • 獨立性高的專案
  • 不同團隊負責
  • 需要嚴格權限控制
    步驟2:使用 Git Submodules
    什麼是 Submodules?
    主專案
    ├── frontend/
    ├── backend/
    └── shared-lib/ → 指向另一個 Git repository
    建立實戰範例:

建立主專案

mkdir company-platform
cd company-platform
git init

建立基本結構

mkdir docs
echo "# 公司平台專案" > README.md
git add .
git commit -m "init: 初始化專案"

假設你有一個共用函式庫的 repo

將它加入為 submodule

git submodule add https://github.com/你的帳號/shared-utils.git libs/shared-utils

查看 submodule 狀態

git submodule status

提交 submodule 設定

git add .
git commit -m "feat: 新增共用函式庫 submodule"
Submodule 基本操作:

複製包含 submodules 的專案

git clone --recursive https://github.com/你的帳號/company-platform.git

如果已經 clone 了,後來才初始化 submodules

git submodule init
git submodule update

或使用一個指令

git submodule update --init --recursive

更新 submodule 到最新版本

cd libs/shared-utils
git pull origin main
cd ../..
git add libs/shared-utils
git commit -m "chore: 更新共用函式庫版本"

移除 submodule

git submodule deinit libs/shared-utils
git rm libs/shared-utils
rm -rf .git/modules/libs/shared-utils
git commit -m "chore: 移除共用函式庫 submodule"
步驟3:使用 Sparse Checkout(稀疏檢出)
只下載需要的檔案:

建立新的 clone,不下載工作目錄

git clone --no-checkout https://github.com/大型專案/repo.git
cd repo

啟用 sparse checkout

git sparse-checkout init --cone

只檢出特定目錄

git sparse-checkout set frontend/components

檢出多個目錄

git sparse-checkout set frontend/components backend/api

查看目前設定

git sparse-checkout list

下載檔案

git checkout main
步驟4:使用 Shallow Clone(淺層複製)
只下載最近的歷史:

只下載最近 1 個 commit 的歷史

git clone --depth 1 https://github.com/大型專案/repo.git

只下載最近 10 個 commit

git clone --depth 10 https://github.com/大型專案/repo.git

下載特定分支

git clone --depth 1 --branch main https://github.com/大型專案/repo.git

如果需要更多歷史,可以後續增加

git fetch --deepen=100 # 增加 100 個 commit 的深度

轉換為完整 clone

git fetch --unshallow
效果比較:
完整 clone:
時間:10 分鐘
大小:2 GB
歷史:10,000 commits

Shallow clone (depth=1):
時間:30 秒
大小:50 MB
歷史:1 commit
步驟5:大型專案的目錄結構
建議的結構:

建立清楚的目錄結構

mkdir -p company-platform/{apps,packages,tools,docs}

結構說明

company-platform/
├── apps/ # 應用程式
│ ├── web-app/ # 網頁應用
│ ├── mobile-app/ # 行動應用
│ └── admin-panel/ # 管理後台
├── packages/ # 共用套件
│ ├── ui-components/ # UI 元件庫
│ ├── utils/ # 工具函數
│ └── api-client/ # API 客戶端
├── tools/ # 開發工具
│ ├── build-scripts/ # 建置腳本
│ └── linters/ # 程式碼檢查
├── docs/ # 文件
│ ├── architecture/ # 架構文件
│ ├── api/ # API 文件
│ └── guides/ # 開發指南
├── .github/ # GitHub 設定
│ ├── workflows/ # CI/CD
│ └── CODEOWNERS # 程式碼擁有者
└── README.md # 專案說明
建立 CODEOWNERS 檔案:
cat > .github/CODEOWNERS << 'EOF'

預設擁有者

  • @team-leads

前端團隊負責

/apps/web-app/ @frontend-team
/packages/ui-components/ @frontend-team

後端團隊負責

/apps/api/ @backend-team
/packages/api-client/ @backend-team

DevOps 團隊負責

/.github/workflows/ @devops-team
/tools/ @devops-team

文件由技術寫作團隊負責

/docs/ @tech-writers
EOF
步驟6:大型專案的 .gitignore
cat > .gitignore << 'EOF'

依賴套件

node_modules/
vendor/
*.pyc
pycache/

建置輸出

dist/
build/
*.egg-info/
*.min.js
*.min.css

環境設定

.env
.env.local
*.local

IDE 設定

.vscode/
.idea/
*.swp
*.swo

作業系統

.DS_Store
Thumbs.db

日誌和資料庫

*.log
*.sqlite
*.db

測試覆蓋率報告

coverage/
.coverage
htmlcov/

暫存檔案

*.tmp
*.temp
*.cache
EOF


大型專案管理技巧
技巧1:使用 Git LFS(大檔案儲存)

安裝 Git LFS

macOS: brew install git-lfs

Ubuntu: apt-get install git-lfs

Windows: 下載安裝程式

初始化 LFS

git lfs install

追蹤大型檔案

git lfs track ".psd"
git lfs track "
.zip"
git lfs track ".mp4"
git lfs track "design/**/
.ai"

查看追蹤的檔案類型

git lfs track

提交 .gitattributes

git add .gitattributes
git commit -m "chore: 設定 Git LFS 追蹤大型檔案"
技巧2:定期清理歷史

查看 repository 大小

git count-objects -vH

找出最大的檔案

git rev-list --objects --all |
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' |
sed -n 's/^blob //p' |
sort --numeric-sort --key=2 |
tail -10

從歷史中移除大檔案(危險操作!)

先備份!

git filter-branch --tree-filter 'rm -f 大檔案.zip' HEAD

或使用 BFG Repo-Cleaner(更快)

java -jar bfg.jar --delete-files 大檔案.zip

技巧3:使用 Git Worktree

同時處理多個分支

建立新的工作目錄

git worktree add ../project-feature feature/new-function

查看所有 worktree

git worktree list

在新目錄工作

cd ../project-feature

這裡是 feature/new-function 分支

移除 worktree

git worktree remove ../project-feature
技巧4:優化 Git 設定

啟用檔案系統監控(加快 git status)

git config core.fsmonitor true
git config core.untrackedcache true

增加壓縮等級

git config core.compression 9

設定更大的記憶體緩存

git config pack.windowMemory "100m"
git config pack.packSizeLimit "100m"
git config pack.threads "4"

啟用平行處理

git config submodule.fetchJobs 4


Monorepo 實戰範例
建立 Monorepo 結構:

初始化 monorepo

mkdir company-monorepo
cd company-monorepo
git init

建立結構

mkdir -p {apps,packages}/{web,mobile,shared}

建立根目錄的 package.json

cat > package.json << 'EOF'
{
"name": "company-monorepo",
"private": true,
"workspaces": [
"apps/",
"packages/
"
],
"scripts": {
"dev": "npm run dev --workspaces",
"build": "npm run build --workspaces",
"test": "npm run test --workspaces"
}
}
EOF

建立 README

cat > README.md << 'EOF'

公司 Monorepo

專案結構

  • apps/ - 應用程式
  • packages/ - 共用套件

開發指令

npm install      # 安裝所有依賴
npm run dev      # 啟動開發伺服器
npm run build    # 建置所有專案
npm run test     # 執行所有測試
EOF
提交初始結構
git add . git commit -m "init: 建立 monorepo 基礎結構"

---

## **最佳實踐總結**

### **✅ 大型專案管理清單:**

專案結構: □ 清楚的目錄組織 □ 設定 CODEOWNERS □ 完整的 .gitignore □ 詳細的 README
效能優化: □ 使用 shallow clone □ 啟用 sparse checkout □ 設定 Git LFS □ 定期清理歷史
團隊協作: □ 明確的責任劃分 □ 獨立的 CI/CD 流程 □ 版本管理策略 □ Code Review 規範
工具使用: □ Submodules 或 Monorepo □ 自動化測試 □ 文件自動生成 □ 效能監控

---

## **今日重點回顧**
- ✅ 理解大型專案的管理挑戰
- ✅ 學會使用 Git Submodules
- ✅ 掌握 Sparse Checkout 和 Shallow Clone
- ✅ 了解 Monorepo vs Multi-repo 策略

## **核心指令總結**
```bash
# Submodules
git submodule add <url>              # 新增 submodule
git submodule update --init          # 初始化 submodule
git clone --recursive                # 複製包含 submodules

# 效能優化
git clone --depth 1                  # 淺層複製
git sparse-checkout set <dir>        # 稀疏檢出
git lfs track "*.zip"               # 追蹤大檔案

# Worktree
git worktree add <path> <branch>    # 建立工作目錄
git worktree list                   # 列出所有 worktree


上一篇
Day 16:Git Hooks 自動化 - 讓 Git 自動幫你做事
下一篇
Day 18:Git 效能優化 - 讓 Git 飛快運行
系列文
30天 Git 版本控制實戰筆記19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言