Thursday, January 18, 2018

Git - Include Hanya Folder/File Tertentu, Exclude Sisanya

  No comments
Source Image: git-scm
Assalamu'alaikum Wr. Wb.
Baru-baru ini saya menggunakan Git untuk melakukan tracking dan manajemen source code aplikasi yang iseng saya tulis. Dengan menggunakan Version Control seperti Git sangat membantu saya dalam melakukan perubahan pada kode, karena tidak perlu membuat incremental backup secara manual.

Tepatnya hari ini, saya mendapatkan kendala karena belum berhasil mengatur file .gitignore untuk meng-include hanya sebuah folder + seisinya dan sisanya tidak diikutsertakan untuk ditrack. Setelah membaca dokumentasi resminya dan membaca blog milik orang lain akhirnya tercerahkan juga. Memang cukup mudah, tapi cukup membingungkan juga hehe.

Inilah .gitignore yang saya gunakan sebelumnya:

- Coba 1 (Tidak work)
*
!a/b/

- Coba 2 (Tidak work)
*
!a/b/*.[html|css|js|md|png]

- Coba 3 (Work tapi tidak praktis)
**.*
!**/**.html
!**/**.css

!**/**.js
!**/**.md
!**/**.png

Kupas Masalah dan Sedikit Faktanya:
1. File ".gitignore" digunakan untuk memberitahu Git agar tidak mengikutsertakan (exclude) file/folder dalam trackingnya, sesuai dengan daftar yang ada di dalam file ".gitignore"
"The purpose of gitignore files is to ensure that certain files not tracked by Git remain untracked."
2. Meski begitu, ada opsi negasi untuk mengikutsertakan kembali file/folder yang kita exclude, yaitu dengan menambahkan karakter "!" pada awal baris.
"An optional prefix "!" which negates the pattern; any matching file excluded by a previous pattern will become included again." 
3. ".gitignore" mendukung pola untuk mencari file, Tapi bukan pola RegEx.
Ini adalah alasan kenapa contoh "Coba 2" tidak bekerja. Karena pola yang digunakan untuk mencari kecocokan file adalah pola Regular Expression.
"..Git treats the pattern as a shell glob suitable for consumption by fnmatch(3).."
4. Leading Slash yang menurut saya cukup unik
Jika kita melihat template .gitignore yang ada di GitHub. Teman-teman sadar kalau cara penulisannya tidak semuanya sama, dalam hal ini kita membicarakan karakter slash diawal. Ada yang menggunakan slash diawal dan ada juga yang tidak.

Akan tetapi dalam kasus saya, slash awal ini punya efek yang membuat saya bingung pada awalnya (karena semua pattern yang saya coba tidak bekerja). Dan dalam contoh "Coba 1" diatas, pattern yang saya gunakan mirip dengan contoh yang bekerja yang saya gunakan sekarang, hanya berbeda slash diawal.

Oke, dengan sedikit kupasan dan fakta diatas kita akan mencoba menyelesaikan masalah pada topik artikel ini.
Untuk meng-include kembali folder beserta isinya, yang perlu teman-teman lakukan adalah menuliskan path dari folder nya satu-persatu berdasarkan level foldernya (jika subfolder).

Contoh, saya akan meng-exclude semua file kecuali folder satu dan isinya.

├── README.md
└── satu
    ├── dua
    └── tiga
        └── halo.txt

Ekspektasi kita adalah folder satutiga dan file "halo.txt" dibaca oleh Git dan statusnya menjadi Untracked. namun lainnya akan diabaikan.

Konten .gitignore:
/*
!/satu/

Sebelum memakai .gitignore:
Perhatikan tanda "U" dan warna hijau pada Sidebar.



Sesudah memakai .gitignore:
Perhatikan tanda "U" dan warna hijau pada Sidebar.

Teman-teman mungkin bertanya kenapa folder dua tidak menjadi warna hijau/Untracked? jawabannya adalah karena Git hanya melakukan tracking pada file. Folder dapat ikut ditrack jika ada file didalamnya, nah dalam contoh ini folder dua kondisinya kosong sehingga diabaikan oleh Git.

Referensi:
- Git Documentation - gitignore
- ConSol Labs - Using .gitignore the Right Way

Mungkin cukup sekian yang dapat saya tulis, Mohon maaf jika ada kesalahan dan mohon untuk dikoreksi. Wassalamu'alaikum Wr. Wb.

No comments :

Post a Comment