İç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.

Yayın Güncelleme

Bu derste

  • Bir dizini depoya dönüştürür ve `.git` dizininin bölümlerini adlandırır
  • Üç yapılandırma katmanını ve öncelik sırasını açıklar
  • Bir ayarın hangi dosyadan geldiğini belirler
İç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.

Tarihi Sabitlemek

Bir işlemenin kimliği yalnızca içeriğinden değil, yazarından ve tarihinden de hesaplanır; aynı dosya farklı bir anda işlenirse farklı bir karma değeri çıkar. Bu kursta çıktılarınızın bu derslerdekiyle aynı olması için yazar ve işleyen tarihini sabitleyen iki ortam değişkeni verilir:

export GIT_AUTHOR_DATE="2024-03-04 09:12:00 +0300"
export GIT_COMMITTER_DATE="2024-03-04 09:12:00 +0300"

Değişkenler yalnızca açık olan terminal oturumunda geçerlidir. Sonraki derslerde işlemeler farklı günlere yayıldığı için her işlemeden önce tarih bir kez daha yazılır; sabitlemeyi bırakırsanız her şey çalışır, yalnızca karma değerleri ve tarihler derste görünenlerden ayrışır.

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
branches
config
description
HEAD
hooks
info
objects
refs

Sekiz 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 dördü 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; branches ise eski bir düzenin kalıntısıdır ve bu kursta kullanılmaz. Bu liste Linux’ta, GNU ls ve UTF-8 yerel ayarıyla alınmıştır: sıra yerel ayara bağlıdır (LC_COLLATE=C ile HEAD başa gelir) ve girdi sayısı git sürümüne göre değişebilir. Sizin çıktınız bu listeden küçük farklar gösterebilir; dört temel girdi her yerde vardır.

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

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. Yukarıdaki çıktı bir Linux sisteminden alınmıştır; dosya adlarında büyük/küçük harf ayrımı yapmayan dosya sistemlerinde (macOS ve Windows’un olağan yapılandırmaları) buraya ignorecase = true satırı da yazılır, macOS üzerinde ayrıca precomposeunicode = true eklenir.

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. Katmanların nasıl örtüştüğü böylece görülmüş oldu; bu kursta işlemelerin tümü tek bir kimlikle yazılacağı için depo düzeyindeki ayarı hemen kaldırın:

git config --local --unset user.email

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.

Denemek için deponun içinde iki boş dizin açılır ve en alttakine girilir:

mkdir -p gecici/alt
cd gecici/alt
git rev-parse --show-toplevel

{/* mask: (?<=/tmp/ders-)[a-z0-9_]+ */}

/tmp/ders-p9bhqa2r/sozluk

Çıktı, deponun kök dizininin tam yoludur; kendi makinenizde yolun başı farklı olacaktır (buradaki /tmp/ders-… kısmı bu dersin ölçüldüğü geçici dizindir). Alt bir dizinden çalıştırıldığında da 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/

Denemeden sonra köke dönülür ve boş dizinler silinir:

cd ../..
rmdir gecici/alt gecici

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

{/* mask: (?<=/tmp/ders-)[a-z0-9_]+ */}

file:/tmp/ders-p9bhqa2r/.ev/.gitconfig	user.name=Deniz Kaya
file:/tmp/ders-p9bhqa2r/.ev/.gitconfig	[email protected]
file:/tmp/ders-p9bhqa2r/.ev/.gitconfig	init.defaultbranch=main

Her satırın başında değerin okunduğu dosya yazar; buradaki yol dersin ölçüldüğü geçici ev dizinidir, sizin çıktınızda kendi ev dizininizin .gitconfig dosyası 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