~/saidqb cat wiki/stack/git/project-app-dan-doc.md
commit by saidqb
Struktur 2 — Ada doc/ dan project/
Satu repo dipakai bareng untuk kode aplikasi dan dokumentasi/catatan internal, dipisah per folder:
repo/
├── doc/ <- catatan, notulen, dokumentasi internal — TIDAK di-deploy
│ ├── notes.md
│ └── meeting-2026-08.md
└── project/ <- source code aplikasi — INI yang di-deploy
├── src/
├── public/
└── package.json
doc/ tidak boleh ikut ke server production (isinya catatan internal, bukan kode jalan), jadi push biasa tidak bisa dipakai — perlu git subtree untuk ambil isi folder project/ saja lalu dorong ke branch/remote production.
Urutan Deploy
Kondisi normal: repo baru cuma punya branch main, branch production belum ada sama sekali. Tidak perlu git subtree add — langsung mulai dari langkah 1, branch production akan otomatis dibuat di langkah 2.
- Commit dulu semua perubahan ke branch biasa (
main) — wajib, karenagit subtree pushcuma baca apa yang sudah ada di history commit, bukan isi working directory. Perubahan yang belum di-add+committidak akan ikut ke-push sama sekali
git add project
git commit -m "update project"- Push subtree folder
project/ke branchproduction(di remoteoriginyang sama, atau remote terpisah)
git subtree push --prefix=project origin productionCommand ini mengambil isi folder project/ (bukan seluruh repo) dari commit terakhir di local, lalu push ke branch production seolah-olah project/ itu sendiri adalah root repo — doc/ otomatis tidak pernah ikut.
- Di server, deploy dari branch
productionitu (bukanmain)
ssh user@server "cd /var/www/app && git pull origin production"- Update berikutnya, ulangi urutan yang sama: commit dulu, baru subtree push
git add project
git commit -m "update project"
git subtree push --prefix=project origin productionPengecualian: Branch production Sudah Ada Duluan (Bukan Dibuat dari subtree push)
Ini bukan langkah wajib di awal — cuma berlaku kalau branch production sudah ada isinya sendiri dari luar (misalnya di-clone dari sumber lain, bukan hasil git subtree push pertama kali dari folder project/ repo ini). Kalau kondisinya begitu, pakai git subtree add sekali saja untuk menggabungkan branch itu ke folder project/ di branch development:
git subtree add --prefix=project origin production --squashCommand ini dipakai sekali saja — saat pertama kali menghubungkan folder project/ ke branch production yang sudah punya histori sendiri. Sesudah itu, sinkronisasi berikutnya pakai git subtree pull/git subtree push seperti biasa (lihat di bawah). Kalau langsung pakai pull tanpa add dulu padahal folder project/ belum pernah terhubung ke branch itu, git akan menolak karena tidak ada histori subtree yang bisa disambung.
Tarik Balik dari Production
Kadang ada perubahan yang terjadi langsung di branch production (misalnya hotfix darurat di server, atau branch itu sempat diubah dari tempat lain) dan perlu disinkronkan balik ke folder project/ di branch development. Untuk ini pakai git subtree pull, kebalikan dari push:
git subtree pull --prefix=project origin production --squashCommand ini mengambil isi branch production dari remote origin, lalu menggabungkannya ke folder project/ di branch lokal saat ini. Opsi --squash memadatkan seluruh histori commit branch production menjadi satu commit merge, supaya histori di project/ tidak dibanjiri commit-commit kecil dari sisi production.
Kenapa bukan .gitignore saja
.gitignore cuma mencegah file baru ditambahkan — tidak menghapus folder doc/ dari histori kalau sudah pernah ke-commit, dan tidak membantu kalau doc/ memang perlu tetap ada di branch development. git subtree menjaga kedua kebutuhan tetap terpisah rapi: satu repo untuk development (isinya lengkap termasuk doc/), satu branch/remote bersih untuk production (isinya cuma project/).
Kapan cocok pakai pola ini
- Repo dipakai bareng buat kode + dokumentasi tim, tapi cuma kode yang boleh nyampe ke server.
- Belum butuh proses build terpisah — isi folder
project/sudah langsung bisa dijalankan.
Kalau project/ sendiri butuh proses build dulu sebelum bisa dijalankan (misal frontend yang perlu npm run build), lihat project-app-build-dan-doc.md.