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/headsdal uçlarını,refs/tagsetiketleri 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.nameveuser.emailtanımlı değilse işleme yazılamaz; bu değerler işlemenin kimliğine girer.git init, var olan bir dizinde.gitalt dizinini oluşturur; depo o alt dizindir..git/objectsnesne veritabanını,.git/refsadlandırılmış başvuruları,.git/HEADo 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.