Logo

~/saidqb cat wiki/stack/git/project-app-dan-doc.md

MDproject-app-dan-doc

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.

  1. Commit dulu semua perubahan ke branch biasa (main) — wajib, karena git subtree push cuma baca apa yang sudah ada di history commit, bukan isi working directory. Perubahan yang belum di-add+commit tidak akan ikut ke-push sama sekali
bash
git add project
git commit -m "update project"
  1. Push subtree folder project/ ke branch production (di remote origin yang sama, atau remote terpisah)
bash
git subtree push --prefix=project origin production

Command 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.

  1. Di server, deploy dari branch production itu (bukan main)
bash
ssh user@server "cd /var/www/app && git pull origin production"
  1. Update berikutnya, ulangi urutan yang sama: commit dulu, baru subtree push
bash
git add project
git commit -m "update project"
git subtree push --prefix=project origin production

Pengecualian: 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:

bash
git subtree add --prefix=project origin production --squash

Command 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:

bash
git subtree pull --prefix=project origin production --squash

Command 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.