İçeriğe geç
academia.sh

Ders 03 / 15

Depo Oluşturma ve Yapılandırma

Boş bir dizinin depoya dönüştürülmesi, `.git` dizininin içeriği ve sistem, kullanıcı ile depo düzeyindeki yapılandırma katmanlarının önceliği.

İçindekiler

Önceki iki ders modeli kurdu: tarihçe bir yönlü çevrimsiz çizgedir ve dağıtık bir sistemde bu çizgenin tamamı yerelde durur. Bu ders modeli somutlaştırır — kursun örnek deposu olan sozluk projesi oluşturulur ve deponun disk üzerindeki karşılığı incelenir.

Yapılandırmayla başlamak gerekir, çünkü bir işlemenin yazarı yapılandırmadan okunur ve yazar bilgisi işlemenin kimliğine girer.

Üç Yapılandırma Katmanı

Ayarlar üç ayrı dosyada tutulur ve dar kapsamlı olan geniş olanı örter:

Katman Kapsam Seçenek
Sistem Makinedeki tüm kullanıcılar --system
Kullanıcı Bir kullanıcının tüm depoları --global
Depo Yalnızca içinde bulunulan depo --local

Aynı anahtar birden çok katmanda tanımlıysa depo düzeyindeki değer geçerlidir. Bu, “genel olarak şu kimlikle çalışırım, ama şu depoda başka bir kimlik kullanırım” ayrımını mümkün kılar.

Kullanıcı düzeyinde üç ayar yapılır:

git config --global user.name "Deniz Kaya"
git config --global user.email "[email protected]"
git config --global init.defaultBranch main

İlk ikisi işlemelerin yazar alanını doldurur; ikisi tanımlı değilse işleme yazma denemesi hatayla durur. Üçüncüsü, yeni oluşturulan depoların ilk dalının adını belirler. Dal (branch) kavramı Dallanma ve İşbirliği kursunun konusudur; burada yalnızca çıktılarda görünecek bir ad olarak geçecektir.

Ayarların yazıldığı yer okunabilir:

git config --list --global
user.name=Deniz Kaya
[email protected]
init.defaultbranch=main

Anahtar adlarının bölüm ve ad kısımlarının büyük/küçük harf duyarsız olduğuna dikkat edin: init.defaultBranch yazıldı, init.defaultbranch olarak listelendi. Değerler ise harfi harfine korunur.

Depoyu Oluşturmak

Depo, var olan bir dizin içinde kurulur:

mkdir sozluk
cd sozluk
git init

Komut tek satırlık bir onay yazar: Initialized empty Git repository in ifadesinin ardından oluşturulan .git dizininin tam yolu gelir. Yol, komutun çalıştırıldığı dizine bağlı olduğu için her sistemde farklıdır.

Bu andan sonra dizin bir depodur. Dizinin görünür içeriği değişmemiştir; eklenen tek şey .git adlı gizli bir alt dizindir. Depo, o alt dizinin kendisidir: .git silinirse dosyalar kalır, tarihçe gider.

.git Dizininin İçeriği

ls .git
HEAD
config
description
hooks
info
objects
refs

Yedi girdiden dördü bu kurs boyunca sürekli kullanılacaktır:

  • objects — nesne veritabanı. Önceki derste anlatılan içerik adresli depolama burada gerçekleşir: dosya içerikleri, dizin görüntüleri ve işlemeler bu dizinde karma değerlerine göre adlandırılmış dosyalar hâlinde durur. Yeni bir depoda boştur.
  • refs — insan tarafından okunabilir adları nesne kimliklerine bağlayan başvurular. refs/heads dal uçlarını, refs/tags etiketleri tutar. İkisi de başlangıçta boştur.
  • HEAD — o an üzerinde çalışılan başvuruyu gösteren tek satırlık dosya.
  • config — deponun kendi yapılandırması; üç katmanın en dar olanı.

Kalan üçü daha seyrek kullanılır: hooks belirli olaylarda çalıştırılacak betikleri, info depoya özel yardımcı dosyaları, description yalnızca bazı sunucu arayüzlerinin okuduğu bir tanım metnini tutar.

HEAD dosyası doğrudan okunabilir:

cat .git/HEAD
ref: refs/heads/main

İçerik bir nesne kimliği değil, bir başvuruya yapılan başvurudur. Henüz hiçbir işleme yazılmadığı için refs/heads/main dosyası da yoktur; HEAD var olmayan bir hedefi gösterir. Bu geçici tutarsızlık, ilk işleme yazıldığında giderilecektir.

Deponun Kendi Yapılandırması

cat .git/config
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true

Bu değerler depo oluşturulurken sistemden okunarak yazılır. repositoryformatversion depo biçiminin sürümünü, bare deponun çalışma dizini olup olmadığını, logallrefupdates başvuru değişikliklerinin günlüğe yazılıp yazılmayacağını belirtir. Son ikisi dosya sistemine bağlıdır: ignorecase, dosya adlarında büyük/küçük harf ayrımı yapmayan dosya sistemlerinde (macOS ve Windows’un olağan yapılandırmaları) true olur; precomposeunicode yalnızca macOS üzerinde yazılır. Çoğu Linux dosya sisteminde bu iki satır bulunmaz.

Depo düzeyine bir ayar yazmak için komut deponun içinden, --local seçeneğiyle çalıştırılır:

git config --local user.email "[email protected]"

Bu satır yalnızca sozluk deposundaki işlemeleri etkiler; kullanıcı düzeyindeki değer diğer depolarda geçerli kalır.

Deponun Kökü Nasıl Bulunur

Komutlar deponun kök dizininden çalıştırılmak zorunda değildir. Bir komut çalıştırıldığında, içinde bulunulan dizinden başlanarak yukarı doğru .git aranır; bulunan ilk .git deponun kökünü belirler.

git rev-parse --show-toplevel
<ust-dizin>/sozluk

Çıktı, deponun kök dizininin tam yoludur; yukarıda üst dizinin adı kısaltılmıştır. Alt bir dizinden çalıştırıldığında aynı değer döner; kökün neresi olduğu bulunulan yere göre değişmez. Kök ile bulunulan yer arasındaki göreli yol ayrıca sorulabilir:

git rev-parse --show-prefix
gecici/alt/

Arama yukarı doğru olduğu için, bir deponun içinde ikinci bir git init çalıştırmak beklenen sonucu vermez: yeni bir .git oluşur ve o alt ağaç dıştaki depodan kopar. İç içe depo gerektiren durumlar için ayrı düzenekler vardır; bu kursta tek bir depo kullanılacaktır.

Depo dışında çalıştırılan komut açık bir hata verir:

fatal: not a git repository (or any of the parent directories): .git

Bir Değerin Kaynağını Bulmak

Beklenmedik bir ayarın hangi katmandan geldiği doğrudan sorulabilir:

git config --list --show-origin --global
file:<ev-dizini>/.gitconfig	user.name=Deniz Kaya
file:<ev-dizini>/.gitconfig	[email protected]
file:<ev-dizini>/.gitconfig	init.defaultbranch=main

Her satırın başında değerin okunduğu dosya yazar; yukarıdaki çıktıda ev dizininin yolu kısaltılmıştır, gerçek çıktıda tam yol görünür. Katman seçeneği kaldırılırsa üç katmanın tamamı birleştirilmiş hâlde listelenir ve aynı anahtarın birden çok satırda görünmesi mümkündür; bu durumda geçerli olan son satırdır.

Tek bir anahtarın geçerli değeri şöyle sorulur:

git config user.name
Deniz Kaya

İlk Durum

git status
On branch main

No commits yet

nothing to commit (create/copy files and use "git add" to track)

Üç satır üç ayrı bilgi verir. Birincisi, HEAD dosyasının gösterdiği başvurunun adıdır. İkincisi, refs/heads/main başvurusunun henüz bir nesneye bağlanmadığını söyler. Üçüncüsü, çalışma dizininde kayda alınacak hiçbir şey bulunmadığını bildirir.

git status bu kursun en sık çalıştırılacak komutudur. Her seferinde aynı soruyu yanıtlar: çalışma dizini, hazırlık alanı ve son işleme arasında hangi farklar var? Sonraki konu bu üç bölgeyi tek tek tanımlayacaktır.

Özet

  • Yapılandırma sistem, kullanıcı ve depo katmanlarında tutulur; dar kapsam geniş kapsamı örter.
  • user.name ve user.email tanımlı değilse işleme yazılamaz; bu değerler işlemenin kimliğine girer.
  • git init, var olan bir dizinde .git alt dizinini oluşturur; depo o alt dizindir.
  • .git/objects nesne veritabanını, .git/refs adlandırılmış başvuruları, .git/HEAD o an çalışılan başvuruyu tutar.
  • --show-origin, bir ayarın hangi dosyadan geldiğini gösterir.

Sonraki Adım

Depo kuruldu ama boş. Bir dosya oluşturulduğunda ne olur — dosya doğrudan tarihçeye mi girer, yoksa arada bir aşama mı vardır? Sonraki ders, çalışma dizini ile nesne veritabanı arasında duran hazırlık alanını tanımlayacak ve bu alanın .git içindeki karşılığını gösterecek.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat