Bazen Görmezden Gelmeli: .gitignore Dosyaları

Berke Sayın
5 min readOct 1, 2022

--

GIT - the stupid content tracker: April 7th, 2005…

Git-GitHub and Version Control Systems Series: Part 3, By Berke

Uygulama geliştirme sürecinin sağlıklı ve sürdürülebilir bir şekilde yürütülmesi açısından versiyon kontrolünün öneminden bahsetmiştim. Versiyon kontrolü ile aslında projenin commit’lerini ve file history’sini izleyebiliyoruz, ve bu da Git’in bizim için sağladığı çok kullanışlı bir yöntem. Peki gerçekten Git her durumda bütün dosyaları takip etmeli mi?

Herkese merhaba, yazılım geliştirme süreci ve proje takibi için versiyon kontrolü çok önemli. Burada ise Git ile çalışırken, Git’in takip etmesini istemediğimiz klasörlerin ve dosyaların yönetilmesini açıklayacağım. Keyifli okumalar :)

GIT — the stupid content tracker: April 7th, 2005

Git Ignore kavramından bahsetmeden önce Git hakkında kısa bir bilgi vermek istiyorum.

Initial revision of "git", the information manager from hell

Bu commit mesajı; 7 Nisan 2005 tarihinde Linus Torvalds’ın oluşturduğu Git için initial commit’e ait. O commit’in Readme ksımında Git için “Global Information Tracker” ifadesinden bahsediyor. Yani Git aslında bilgi ve dosya takibi ve ayrıca proje yönetimi için oluşturulmuş ve geliştirilmeye devam eden fonksiyonel bir versiyon kontrolü aracı. Biz de gerek bireysel gerekse ekip olarak uygulama geliştirme sürecinde Git’in bize sağladığı fonksiyonlardan yararlanıyoruz.

Git’in Projeye Dahil Edilmesi

Projeyi bir Git Repository’si haline getirmek için git init komutunu kullanırız. Bu komut, bulunduğumuz dizinde .git adında bir klasör oluşturur ve bu da şu anlama gelir: Artık biz bu proje içerisinde Git’in bütün özelliklerini ve komutlarını kullanabiliriz.

git init

Bir proje git repository’si haline getirildikten sonra, Git proje dosyalarında bulunan değişiklikleri takibe alır. Bunu yaparken de dosyaları 3 farklı başlıkta gösterir.

  1. Tracked files: Daha önce working directory’mizden staging area’ya taşıdığımız veya commit’lediğimiz dosyalar,
  2. Untracked files: Daha önce staging area’ya alınmamış(unstaged) veya commit’lenmemiş dosyalar,
  3. Ignored files: Git’in Ignore etmesini istediğimiz yani bir başka deyişle takip etmemesini, göz ardı etmesini istediğimiz dosyalar.

Hangi durumlarda Git’in dosyaları Ignore etmesini isteyebiliriz?

  • Kod yazma sürecinde kullandığımız kod editörünün / IDE’nin geçici olarak oluşturduğu dosyalar,
  • Ekip olarak çalışırken yalnızca kendi local’imizde bulunmasını istediğimiz, yani codebase’e push’lamak istemediğimiz dosyalar,
  • Paket yöneticisinden indirilen bazı dosyalar; /node_modules veya /packages gibi,
  • İşletim sistemine ait gizli sistem dosyaları,
  • Runtime’da üretilen .log, .lock, .tmp dosyaları ,

Bu gibi dosyaların Git tarafından takip edilmesini istemeyebiliriz.

.gitignore Dosyası

Çalışma süresince göz ardı edilmesini istediğimiz dosyaları .gitignore dosyası içerisinde belirtiriz. .gitignore dosyası projenin root directory’sinde, yani ilk dizininde oluşturulur. .gitignore dosyasının kendine özel yazım pattern’i (karakterleri) vardır. Bu dosya içerisinde git ignore patterns kullanarak yapacağımız tanımlamalar ile istediğimiz dosyaların veya klasörlerin izlenmesini iptal edebiliriz.

.gitignore dosyasının kullanımını aşağıdaki örnek klasör/dosya yapımızla inceleyelim.

Burada ‘dev’ klasörünü herhangi bir kod editörü veya IDE ile açmamız gerekli. Ayrıca projemizde Git ile çalışabilmek için git init komutunu kullanmamız gerektiğini de daha önce söylemiştim. Bu şekilde klasör/dosya yapımızı oluşturduktan sonra initialize repository diyelim. Ardından root directory’de .gitignore isimli bir dosya oluşturalım. Artık burada özel git ignore patterns kullanarak yapacağımız tanımlamalar ile istediğimiz dosya veya klasörün git tarafından takip edilmemesini sağlayabiliriz.

Git Ignore Patterns Kullanımı

Burada da git ignore patterns’i yukarıdaki örnek folder-tree yapımızda uygulayarak göstermek istiyorum.

Yorum Satırı

  • .gitignore dosyasında ‘#’ karakteri yorum satırı için kullanılır. Şöyle bir örnek verebiliriz:
# .log uzantılı tüm dosyaları ignore edelim.

Şimdi de yukarıdaki örnek folder-tree yapımızda farklı klasör veya dosyaların takibini bırakmak için hangi pattern’i kullanmamız gerektiğine bakalım.

Belli Bir Klasörü veya Dosyayı Ignore Edelim:

  • .gitignore dosyasını projemizin root directory’sinde oluşturmuştuk. build klasörünü ve içindeki diğer klasör veya dosyaları tamamen ignore etmek için .gitignore dosyasında sadece build yazmamız yeterli:
# Ignoring 'build' folder:
build
  • Aynı şekilde ‘tests’ ve ‘home’ klasörlerini de ignore edebiliriz:
# Ignoring 'tests' folder:
tests
# Ignoring 'home' folder:
home

Burada ‘tests’ ve ‘home’ klasörlerini ignore ettiğimizde bir önceki örnekte olduğu gibi aslında içlerinde bulunan dosyalar da ignore edilmiş oluyor.

  • Sadece bir dosyayı ignore etmek istediğimizde ise o dosyanın yolunu tam olarak belirtmemiz gerekir:
# Ignoring debug_a.log file:
build/logs/debug_a.log
# Ignoring test2.js file:
tests/test2.js
# Ignoring style.css file:
home/style.css

Belli Uzantılı Dosyaları Ignore Edelim:

Projemizde runtime’da üretilen aynı uzantılı dosyaları, sistem dosyalarını veya bir şekilde belli uzantılı dosyaları ignore etmek istiyor olabiliriz. Bu durumda da * (Asterisk) karakterini kullanırız.

Burada kullandığımız * karakteri aslında glob patterns’den geliyor, yani .gitginore dosyasında aslında globbing patterns kullanarak tanımlama yapıyoruz.

  • Örneğin ‘.log’ uzantılı tüm dosyaları ignore edelim:
# Ignoring all .log files: 
*.log
# Ignoring all .js files:
*.js

Bir Klasörün Altındaki Belli Uzantılı Dosyaları Ignore Edelim:

Buradaki örnekte hem ‘tests’ klasörü içerisinde hem de ‘home’ klasörü içerisinde birden fazla ‘.js’ uzantılı dosya bulunuyor. Herhangi bir sebepten ötürü yalnızca ‘tests’ klasörü içerisindeki tüm ‘.js’ dosyalarını ignore etmek istediğimizi varsayalım.

Aslında buradaki örnekte ‘tests’ klasöründe bulunan 3 adet .js dosyasını ayrı ayrı belirterek de ignore edebilirdik. Fakat farklı bir projede, başka bir senaryoda elimizde çok sayıda ignore etmek istediğimiz dosya bulunabilir.

  • Bu sebeple bu örneği de paylaşmak istiyorum:
# Ignoring all .js files inside ‘tests’ folder: 
tests/*.js

Burada dikkat edilmesi gereken ayrıntı şu: Böyle bir yazım şekli yalnızca ‘tests’ klasörünün bir altındaki dizinde sade şekilde bulunan .js dosyalarını kontrol eder. Burada 3 farklı .js dosyası direkt olarak tests klasörü içierisinde yer aldığı için ignore edilir. Fakat arada farklı bir klasör daha olsaydı onu da belirtmemiz gerekirdi.

  • Örneğin ‘build’ klasörünün altındaki herhangi bir klasörün içerisinde yer alan .log uzantılı dosyaları ignore edelim:
build/*/*.log

Burada ortadaki * karakteri ‘build’ içerisindeki klasörler anlamına gelir ve build altında bulunan ‘logs’ klasöründeki 3 adet .log dosyası da ignore edilmiş olur.

Verdiğim örneklerle .gitignore dosyası yazım kurallarına değinmiş oldum. Git ignore patterns / globbing patterns konusunu daha detaylı incelemek ve farklı yazım tekniklerini ayrıntılı şekilde görmek için Atlassian’ın Git Ignore Tutorial’ına veya diğer docs sayfalarına göz atabilirsiniz.

Şimdiye kadar yaptığımız örneklerde herhangi bir dosyayı oluşturup içrerisinde değişiklik yaptıktan sonra staging area’ya almadan ve commit’lemeden ignore etme işlemini gerçekleştirmiştik.

Bir başka deyişle şimdiye kadar Untracked durumdaki dosyalarla çalıştık ve ignore işlemini gerçekleştirdik. Bu durumda herhangi bir sorun olmadan ignore işlemi gerçekleştirilir.

Peki daha önce staging area’ya alınmış ve commit’lenmiş dosyaları da aynı şekilde ignore edebilir miyiz?

Tracked files durumundaki, yani daha önce commit’lenmiş veya en azından staging area’ya alnımış olan dosyaları .gitignore dosyasına eklediğimizde hala takip edildiğini görürüz. Bunu engellemek ve böyle dosyaların da git tarafından takip edilmemesini sağlamak için bir komut çalıştırmamız gerekli.

Örneğin tests klasöründe bulunan test2.js dosyasında geliştirme yapıyoruz. Dosyayı .gitignore dosyasına yazma ihtiyacımız yoktu veya o an yazmayı unuttuk. O şekilde değişiklikleri commit’ledik. Dosya üzerinde çalışmaya devam ediyoruz fakat artık o dosyanın ignore edilmesine ihityacımız var. Bu durumda terminalde tests klasörüne locate olduktan sonra şu komutu yazarız:

git rm --cached test2.js

Bu işlemi yaptıktan sonra editörümüzde source kontrol alanında test2.js dosyası üzerine geldiğimizde Index Deleted şeklinde bir yazı görürüz. Yani aslında Git daha önce cache’de index’lediği bu dosyayı siliyor. Bu yaptığımız silme işlemi de source kontrol alanında changes’a düşer ve bu şekilde commit’ledikten sonra test2.js’yi .gitignore dosyasında belirttiğimizde o dosya da ignore edilir.

Kod yazma sürecinde kullandığımız kod editörünün / IDE’nin geçici olarak oluşturduğu dosyalar, klasörleri de ignore etmek isteriz. Bu durum için github’da gitignore isimli open source bir repository mevcut. O repo altında farklı programlama dilleri veya kod editörleri / IDE’ler için kullanabileceğimiz gitignore dosyaları bulunuyor. Oradan o anki ihtiyacımıza göre bizim için gerekli olan kodu alabiliriz.

Bunun için bir diğer yöntem de gitignore.io (toptal) sitesinde ihtiyacımıza göre gerekli olan gitignore dosyasını hazır bir şekilde elde edip, süreç içerisinde değiştirebiliriz.

--

--

No responses yet