Manual Mirror 1:1 and Autosync Repository
Panduan ini membahas cara membuat salinan repository yang benar-benar 1:1 dari upstream, termasuk branch, tag, dan refs lain, lalu bagaimana mengaktifkan autosync menggunakan Forgejo atau Gitea.
Cocok dipakai ketika kamu ingin:
- menyimpan mirror privat dari repo publik,
- memastikan target identik dengan source,
- melakukan sync manual kapan saja,
- atau membiarkan Forgejo/Gitea melakukan sync otomatis.
Kapan pakai mirror?
Section titled “Kapan pakai mirror?”Kalau tujuanmu adalah menyalin repository secara penuh, gunakan mirror.
Perbedaannya:
git clonebiasa: untuk kerja harian dengan working treegit clone --bare: untuk copy repository tanpa working treegit clone --mirror: untuk copy repository beserta seluruh refs agar hasilnya semirip mungkin dengan upstream
Kalau yang dicari adalah copy 1:1, pilih --mirror.
Opsi 1 — Manual mirror 1:1
Section titled “Opsi 1 — Manual mirror 1:1”Step 1: Buat repository kosong di target
Section titled “Step 1: Buat repository kosong di target”Buat repository kosong di platform tujuan, misalnya Forgejo, Gitea, atau GitHub.
Contoh target:
https://git.example.com/your-org/private-repo.git
Step 2: Clone seluruh refs dari source
Section titled “Step 2: Clone seluruh refs dari source”git clone --mirror https://github.com/original-owner/public-repo.gitcd public-repo.gitStep 3: Push seluruh refs ke target
Section titled “Step 3: Push seluruh refs ke target”git push --mirror https://git.example.com/your-org/private-repo.gitPerintah ini akan mendorong seluruh branch, tag, dan refs lain dari source ke target.
Step 4: Hapus direktori temporary
Section titled “Step 4: Hapus direktori temporary”cd ..rm -rf public-repo.gitOpsi 2 — Sync manual mirror yang sudah ada
Section titled “Opsi 2 — Sync manual mirror yang sudah ada”Kalau mirror sudah pernah dibuat dan kamu hanya ingin update lagi dari upstream:
Step 1: Clone mirror dari source
Section titled “Step 1: Clone mirror dari source”git clone --mirror https://github.com/original-owner/public-repo.gitcd public-repo.gitStep 2: Set push URL ke target private
Section titled “Step 2: Set push URL ke target private”git remote set-url --push origin https://git.example.com/your-org/private-repo.gitStep 3: Push seluruh refs
Section titled “Step 3: Push seluruh refs”git push --mirrorStep 4: Bersihkan direktori temporary
Section titled “Step 4: Bersihkan direktori temporary”cd ..rm -rf public-repo.gitVerifikasi branch dan tag
Section titled “Verifikasi branch dan tag”Untuk memastikan hasil mirror benar-benar 1:1, bandingkan output source dan target.
Cek branch
Section titled “Cek branch”git ls-remote --heads https://github.com/original-owner/public-repo.gitgit ls-remote --heads https://git.example.com/your-org/private-repo.gitCek tag
Section titled “Cek tag”git ls-remote --tags https://github.com/original-owner/public-repo.gitgit ls-remote --tags https://git.example.com/your-org/private-repo.gitKalau hasilnya sama, berarti branch dan tag sudah sinkron.
Autosync menggunakan Forgejo / Gitea mirror
Section titled “Autosync menggunakan Forgejo / Gitea mirror”Kalau kamu memakai Forgejo atau Gitea, repository bisa dibuat dalam mode mirror sehingga sinkronisasi dilakukan otomatis oleh server.
Opsi A: Buat lewat UI
Section titled “Opsi A: Buat lewat UI”- Login ke Forgejo/Gitea
- Pilih New Migration atau Migrate Repository
- Masukkan URL source repository, misalnya:
https://github.com/original-owner/public-repo.git
- Pilih owner atau organization tujuan
- Isi nama repository target
- Aktifkan opsi This repository will be a mirror
- Jalankan migrasi
Setelah selesai, repo akan menjadi mirror dan server akan melakukan sync berkala.
Opsi B: Buat lewat API
Section titled “Opsi B: Buat lewat API”curl -u 'USERNAME:PASSWORD' \ -H 'Content-Type: application/json' \ -X POST https://git.example.com/api/v1/repos/migrate \ -d '{ "clone_addr": "https://github.com/original-owner/public-repo.git", "repo_name": "private-repo", "repo_owner": "your-org", "service": "git", "mirror": true, "private": true }'Cek status mirror lewat API
Section titled “Cek status mirror lewat API”curl -u 'USERNAME:PASSWORD' \ https://git.example.com/api/v1/repos/your-org/private-repoPerhatikan field berikut:
mirrormirror_intervalmirror_updated
Contoh:
{ "mirror": true, "mirror_interval": "8h0m0s", "mirror_updated": "2026-03-13T11:04:17Z"}Artinya repository tersebut adalah mirror dan disinkronkan otomatis tiap interval yang ditentukan server.
Workflow yang disarankan
Section titled “Workflow yang disarankan”Kalau repo target dibuat sebagai mirror murni, jangan jadikan itu repo utama untuk coding harian.
Struktur yang lebih rapi biasanya:
- Repo mirror: salinan 1:1 dari upstream
- Repo kerja privat: tempat commit internal
- Repo fork publik: dipakai saat ingin kirim pull request ke upstream
Dengan pola ini, mirror tetap bersih dan repo kerja tetap fleksibel.
Troubleshooting
Section titled “Troubleshooting”Branch di target terlihat lebih sedikit
Section titled “Branch di target terlihat lebih sedikit”Kemungkinan penyebabnya:
- proses copy tidak menggunakan mode mirror,
- atau upstream memang hanya punya sedikit branch.
Cek dengan:
git ls-remote --heads <source>git ls-remote --heads <target>Kalau hasilnya sama, berarti target sudah benar.
Tag tidak ikut pindah
Section titled “Tag tidak ikut pindah”Pastikan kamu menggunakan:
git push --mirrorbukan hanya:
git push origin mainKarena push biasa hanya mendorong branch tertentu.
Mirror target sudah terlanjur tidak sinkron
Section titled “Mirror target sudah terlanjur tidak sinkron”Cara paling bersih biasanya:
- hapus repository target,
- buat ulang sebagai mirror,
- verifikasi branch dan tag setelah migrasi selesai.