Chapter Konfigurasi Alias sudah memendekkan perintah harian: git st untuk git status -sb. Tapi ada dua bentuk perluasan yang tidak bisa ditangkap alias sederhana — perintah yang butuh argumen (push ke remote mana? branch apa?) dan perintah yang berisi lebih dari satu langkah. Git membuka dua pintu untuk itu: alias berbentuk fungsi shell, dan skrip terpisah git-* yang ditempatkan di PATH hingga menjadi perintah git sungguhan. Keduanya kita bangun dan pakai nyata di chapter ini.

Alias Sebagai Fungsi Shell dengan Argumen #

Kunci pintu pertama adalah tanda seru (!) di nilai alias — perintah dijalankan oleh shell, bukan oleh Git. Masalahnya satu: Git menempelkan argumen kita di ujung nilai alias, jadi git psur origin menjalankan ... ; f origin — titik duanya nempel di tempat yang salah. Solusi standarnya membungkus logika dalam fungsi lalu memanggilnya:

bash
mkdir -p latihan-alias/toko && cd latihan-alias/toko
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
git init --bare ../pusat.git
git remote add origin ../pusat.git
printf 'beranda\n' > README.md
git add README.md
GIT_AUTHOR_DATE="2026-11-11T09:00:00+07:00" GIT_COMMITTER_DATE="2026-11-11T09:00:00+07:00" \
  git commit -m "Buat beranda"
git config alias.psur '!f() { git push "${1:-origin}" "${2:-main}"; }; f'
git psur

Output yang Dihasilkan (perintah terakhir):

text
To ../pusat.git
 * [new branch]      main -> main

Anatomi nilai aliasnya:

  1. f() { ...; } mendefinisikan fungsi bernama f — wadah logika.
  2. ; f di ujung memanggil fungsi itu; argumen yang Git tempel (origin dan semisalnya) jatuh tepat ke pemanggilan f ini.
  3. ${1:-origin} adalah parameter shell dengan nilai bawaan: pakai $1 bila diisi, origin bila kosong. ${2:-main} sama untuk branch.

Hasilnya perintah dua-argumen yang sopan: tanpa argumen mendorong origin main, dengan argumen mengikuti perintah. Kedua bentuknya sudah teruji:

bash
git switch -c fitur-galeri
printf 'galeri\n' > galeri.md
git add galeri.md
GIT_AUTHOR_DATE="2026-11-11T09:10:00+07:00" GIT_COMMITTER_DATE="2026-11-11T09:10:00+07:00" \
  git commit -m "Tambah galeri"
git psur origin fitur-galeri

Output yang Dihasilkan (perintah terakhir):

text
To ../pusat.git
 * [new branch]      fitur-galeri -> fitur-galeri

Nilai alias tersimpan di konfigurasi seperti biasa — git config --get alias.psur mengembalikan !f() { git push "${1:-origin}" "${2:-main}"; }; f — jadi ia bisa dibagikan lewat git config -f .gitconfig-tim yang di-include, atau sekadar dicatat di dokumentasi tim.

Perintah Custom: Berkas git-* di PATH #

Pintu kedua lebih berkuasa: berapa pun panjang logikanya, skrip bisa berdiri sebagai perintah git tersendiri. Mekanismenya sederhana: saat mengetik git halo, Git mencari berkas executable bernama git-halo di PATH — mekanisme yang sama dengan yang dipakai Git untuk sub-perintah bawaannya (via direktori eksekusi internal GIT_EXEC_PATH). Kita buat foldernya dan skrip pertamanya:

bash
mkdir -p ../bin
cat > ../bin/git-halo <<'EOF'
#!/bin/sh
# git-halo — perintah git custom: sapamu dulu, lalu lihat status.
echo "Halo! Kita berada di $(git rev-parse --show-toplevel)"
git status -sb
EOF
chmod +x ../bin/git-halo
PATH="$(cd ../bin && pwd):$PATH" git halo

Output yang Dihasilkan (perintah terakhir):

text
Halo! Kita berada di /home/z/my-project/tutorial-extracted/work/sandbox/hooks-dan-otomasi/latihan-alias/toko
## fitur-galeri

Jalur pada keluaran Anda menyesuaikan lokasi direktori. Tidak ada registrasi, tidak ada file konfigurasi — nama berkas adalah nama perintah. Git bahkan mengakuinya sebagai warga kelas satu:

bash
PATH="$(cd ../bin && pwd):$PATH" git help -a

Output yang Dihasilkan (bagian akhir):

text
External commands
   halo

Perintah custom muncul di bagian External commands dari daftar bantuan. Dalam pemakaian nyata, folder bin/ seperti ini di-clone bersama proyek lalu ditambahkan ke PATH sekali di profil shell — atau dipasang ke ~/.local/bin yang umumnya sudah ada di PATH.

git-siap: Perintah Setup Proyek #

Skrip kedua menunjukkan mengapa pintu ini layak dipakai: git siap menyiapkan repository lengkap — init, konfigurasi identitas, commit pertama — dalam satu perintah, pekerjaan yang tidak mungkin diperas ke satu baris alias:

bash
cat > ../bin/git-siap <<'EOF'
#!/bin/sh
# git-siap — siapkan repository baru siap kerja dalam satu perintah.
# pemakaian: git siap <nama-folder> [pesan-commit-pertama]
set -eu

nama="$1"
pesan="${2:-Commit pertama}"

if [ -e "$nama" ]; then
  echo "git-siap: '$nama' sudah ada" >&2
  exit 1
fi

git init -b main "$nama"
cd "$nama"
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# %s\n\nProyek baru.\n' "$nama" > README.md
git add README.md
git commit -m "$pesan"
git log --oneline
EOF
chmod +x ../bin/git-siap
cd ..
PATH="$PWD/bin:$PATH" git siap proyek-baru "Mulai proyek baru"

Output yang Dihasilkan (perintah terakhir):

text
Initialized empty Git repository in /home/z/my-project/tutorial-extracted/work/sandbox/hooks-dan-otomasi/latihan-alias/proyek-baru/.git/
[main (root-commit) edeac0f] Mulai proyek baru
 1 file changed, 3 insertions(+)
 create mode 100644 README.md
edeac0f Mulai proyek baru

Jalur pada keluaran Anda menyesuaikan lokasi direktori; hash edeac0f berbeda di mesin pembaca. Bagian-bagian pentingnya:

  1. set -eu menghentikan skrip pada perintah gagal (-e) dan variabel tak terdefinisi (-u) — standar minimum skrip sehat yang dibahas lebih lanjut di chapter berikutnya.
  2. if [ -e "$nama" ] menolak membuat folder yang sudah ada — gagal cepat dengan pesan jelas.
  3. ${2:-Commit pertama} kembali memakai nilai bawaan argumen.
  4. git log --oneline di akhir memberi umpan balik bahwa repository benar-benar hidup.

Alias atau Skrip? #

KriteriaAliasSkrip git-*
Panjang logikasatu-dua barisberapa pun
Argumenvia trik fungsi f()argumen skrip normal $1..$n
Berbagi ke timlewat konfigurasi/includelewat repository atau folder bin/
Pengujianmenjalankan ulang manualbisa dites seperti program biasa
Dokumentasi & komentarnyaris tidak adaskrip penuh dengan komentar

Pembagian pragmatisnya: alias untuk yang diketik puluhan kali sehari (harus pendek dan instan), skrip untuk yang berjalan sesekali tapi berbobot (harus kokoh dan bisa dibaca ulang). Skrip git-siap kita persis keduanya — sekali jalan per proyek, tapi kegagalannya harus jelas.

Dua perintah custom ini masih bekerja pada satu repository dalam satu waktu. Otomasi berikutnya naik skala: seluruh folder proyek sekaligus, berjalan sendiri setiap hari — di sanalah shell script menemukan bentuk paling bergunanya.