Ders 03 / 15
Dal Adlandırma
Dal adlandırma düzeni tarihçenin birinci sorusuna dal kaydının yapamadığını ekler: iki tümleştirme biçimi ile dört ad düzeninin sekiz bileşiminden yalnız 3'ünde grup gerçekten okunur, çünkü kayıt ile okunabilir ad ayrı iki koşuldur.
İçindekiler
Önceki ders geçişin hangi dosyaya dokunacağını iki dalın farkından hesapladı ve bu hesap
dalların adına hiç bakmadı. kimlik dalından rapor dalına geçiş üç dosya yazıyordu;
dallar yeni ile deneme diye adlansaydı aynı üç dosyayı yazacaktı. Araç bakımından ad bir
etikettir ve hiçbir davranışı değiştirmez.
Ad başka bir soruya hizmet eder. Aynı depoda otuz dal varken hangisinin hangi işe ait olduğu, hangisinin kapatılabileceği, hangisinin ay boyunca yaşayacağı yalnız adlardan okunur. Kursun ölçü ekseninde bunun karşılığı birinci sorudur: hangi işlemeler hangi işe ait? Bu ders o sorunun iki ayrı koşulu olduğunu gösterir. Tarihçenin dal kaydını tutması gerekir — ve kaydın taşıdığı adın bir şey söylüyor olması gerekir. İkisi birbirinin yerine geçmez ve ölçüm bunu sayar.
Adın İki İşi
Bir dal adı önce bir yoldur. refs/heads/olcum başvurusunun adı olcum’dur ve ad,
başvurunun nerede aranacağını belirler. Eğik çizgi bu yolda bir ayraçtır: ozellik/olcum
adı refs/heads/ozellik/olcum başvurusuna karşılık gelir ve ozellik bir hiyerarşi
basamağı olur. Araç bu basamağı tanır — desen eşleştiren her komut eğik çizgiyi bir sınır
gibi kullanabilir.
Ad ikinci olarak bir bildirimdir. Aracın okumadığı, insanın okuduğu bir alandır. Bir işleme mesajı gibi, sonradan sorulacak sorulara yanıt taşımak üzere yazılır ya da yazılmaz. Dal adlandırma düzeni (branch naming convention) bu ikinci işi düzenli hâle getirir: adın hangi alanları hangi sırayla taşıyacağını belirler.
Alanlar tipik olarak üçtür. Tür işin sınıfını verir (özellik, düzeltme, bakım) ve eğik çizgiden önce durur. İş kaydı adı dışarıdaki bir kayda bağlar; bir numara ya da kısa kod olur. Kısa ad işin kendisini bir iki kelimeyle söyler. Ölçüm bu üç alanı ayrı ayrı sayar, çünkü her biri ayrı bir soruya yanıt verir ve bir düzen üçünü birden taşımak zorunda değildir.
Adın Geçerliliği
Ad bir dosya yolu olarak yazıldığı için biçimi serbest değildir. Araç geçerliliği ayrı bir alt komutla sınar.
# öğretilen komut ve örnek döküm — çalıştırılmamıştır $ git check-ref-format --branch 'ozellik/olcum' ozellik/olcum $ git check-ref-format --branch 'ozellik olcum' fatal: 'ozellik olcum' is not a valid branch name $ git branch --list 'ozellik/*' ozellik/214-olcum ozellik/215-rapor ozellik/216-kimlik
Kuralların çoğu iki kaygıdan doğar. Birincisi kabuk ve komut satırı: boşluk, *, [, ?
ve ters eğik çizgi kabukta anlam taşır ve tırnaklanmadan yazıldığında başka bir şeye
dönüşür. İkincisi aracın kendi başvuru sözdizimi: ~, ^, :, .. ve @{ işaretleri bir
işlemeyi ada göre çözerken kullanılan operatörlerdir. ozellik/olcum~1 bir dal adı olsaydı
“bu dalın bir önceki işlemesi” ifadesi okunamaz hâle gelirdi. .lock uzantısı ise başvuru
yazarken kullanılan kilit dosyalarıyla çakışır.
Bir kural daha var ve ötekilerden ayrı bir yerden gelir. refs/heads altında bir ad hem
dosya hem dizin olamaz; bu yüzden ozellik adında bir dal, ozellik/olcum adında bir dal
varken açılamaz.
# öğretilen komut ve örnek döküm — çalıştırılmamıştır $ git branch ozellik fatal: cannot lock ref 'refs/heads/ozellik': 'refs/heads/ozellik/olcum' exists $ git branch --merged ana ozellik/214-olcum $ git branch -d ozellik/214-olcum Deleted branch ozellik/214-olcum (was 6e2d70b).
Bu, düzenin doğrudan bir sonucudur: bir öneki dal adı olarak da kullanmak, o önek altındaki her adı engeller. Önek yalnız önek olarak kalmalıdır.
Düzenin Ödediği İşler
Ad düzeninin karşılığını verdiği üç günlük iş vardır ve üçü de listeleme komutlarıyla yapılır.
Birincisi süzmedir. git branch --list 'ozellik/*' yalnız o öneki taşıyan dalları
listeler. Düzensiz adlarda bu desen hiçbir şey seçmez; otuz dallık bir depoda hangi dalın
hangi türe ait olduğunu ancak tek tek okuyarak öğrenirsiniz.
İkincisi kapatmadır. git branch --merged ana ana dala alınmış dalları listeler; bunlar
silinebilecek olanlardır. git branch -d yalnız birleşmiş bir dalı siler ve birleşmemişse
reddeder. Zorlayan biçimi bu kontrolü atlar ve önceki dersin ölçüsü bunun bedelini vermişti:
bir dal başvurusu silindiğinde o daldan erişilen dört işleme hiçbir başvurudan erişilemez
hâle gelir. Ad düzeni burada dolaylı ama gerçek bir katkı yapar — hangi dalın kısa ömürlü
olduğu adından okunuyorsa, silinecek dal listesi bir tahmin olmaktan çıkar.
Üçüncüsü ömür ayrımıdır. Uzun ömürlü dal (long-lived branch) deponun yaşadığı sürece duran, silinmeyen ve tek bir işe ait olmayan daldır; adı sabittir ve tür öneki taşımaz. Kısa ömürlü dal (short-lived branch) tek bir iş için açılır, iş tümleştirilince silinir; adı tür önekini ve iş kaydını taşır. İki sınıfın ad biçimi ayrıldığında liste okunduğunda hangisinin bir gün kapanacağı görülür. Ayrım burada yalnız adlandırma düzeyinde kurulur; dal stratejilerinin karşılaştırması birleştirme konusunun son dersine bırakılmıştır.
Ölçümün varsayımları:
- DL15 — Kurgu ortak tanımın on iki işlemesidir ve değiştirilmez. Ad düzeni kurguya eklenen bir katmandır; altı sorunun tanımına dokunmaz.
- DL16 — Ölçüm birinci soruyu,
s1_gruplamaişlevini ortak tanımdaki tanımıyla kullanır: tarihçedeki her işlemenin bir dal kaydı taşıyıp taşımadığına bakar. Bu ders öteki beş soruyu ölçmez; onlar birleştirme konusunda ölçülür. - DL17 — İki tümleştirme biçimi karşılaştırılır: birleştirme işlemesi dal kaydını tutar, ileri sarma tutmaz. Biçimlerin tanımı ortak tanımdan alınır ve değiştirilmez.
- DL18 — Dört ad düzeni denenir: serbest, kısa ad, türe göre, türe ve kayda göre. Her düzen üç dala üç ad verir.
- DL19 — Addan iş okunur ölçütü kâhinle karşılaştırmadır: adın içinde işin kurgudaki adı geçiyorsa okunur sayılır. Addan tür okunur ölçütü eğik çizgiden önceki parçanın bilinen tür listesinde bulunmasını arar; ayraçsız bir kelime tür sayılmaz. İş kaydı ölçütü adın parçaları arasında sayısal bir alan arar.
- DL20 — Grup okunur ölçütü iki koşulun birleşimidir: tarihçe dal kaydını tutuyor ve üç adın üçü de işi veriyor. Koşullardan biri düşerse grup okunmaz.
- DL21 — Ad geçerliliği aracın kural kümesinin bir alt kümesiyle sınanır; ölçüm bir ayrıştırıcı değil, kuralların hangi adayı neden reddettiğini gösteren bir sayımdır.
Ölçüm
"""Dal adlandirma duzeni: dal kaydi ile okunabilir ad ayri kosullardir. Bolum 1 - dort ad duzeni, dort olcut: addan ne okunuyor. Bolum 2 - bicim x duzen caprazi: birinci soru gercekten okunuyor mu. Bolum 3 - ad gecerliligi ve onek cakismasi. """ TOHUM = 20260813 DALLAR = ("olcum", "rapor", "kimlik") DOSYALAR = {"olcum": "olcum.py", "rapor": "rapor.py", "kimlik": "kimlik.py"} KUSURLU = ("rapor", 2) ORTAK_DOSYA = "ayar.py" TURLER = ("ozellik", "duzeltme", "bakim") DUZENLER = { "serbest": {"olcum": "yeni", "rapor": "deneme", "kimlik": "duzeltme"}, "kısa ad": {"olcum": "olcum", "rapor": "rapor", "kimlik": "kimlik"}, "türe göre": {"olcum": "ozellik/olcum", "rapor": "ozellik/rapor", "kimlik": "ozellik/kimlik"}, "türe ve kayda göre": {"olcum": "ozellik/214-olcum", "rapor": "ozellik/215-rapor", "kimlik": "ozellik/216-kimlik"}} BICIMLER = ("birlestirme islemesi", "ileri sarma") def uretec(tohum): d = tohum % 2147483646 + 1 def r(n): nonlocal d d = (d * 48271) % 2147483647 return d % n return r def gelisim(): r, kayit, zaman = uretec(TOHUM), [], 0 for adim in range(1, 5): for dal in DALLAR: zaman += 1 + r(3) dosya = (ORTAK_DOSYA if adim == 3 and dal in ("olcum", "rapor") else DOSYALAR[dal]) kayit.append({"dal": dal, "sira": adim, "dosya": dosya, "kusurlu": (dal, adim) == KUSURLU, "zaman": zaman}) return kayit def tumlestir(kayit, bicim): t = [] if bicim == "birlestirme islemesi": for dal in DALLAR: for k in [x for x in kayit if x["dal"] == dal]: t.append({**k, "dal_kaydi": dal, "zaman_korundu": True}) t.append({"dal": dal, "sira": 0, "dosya": None, "kusurlu": False, "zaman": max(x["zaman"] for x in kayit if x["dal"] == dal), "dal_kaydi": dal, "birlesme": True, "zaman_korundu": True}) elif bicim == "ileri sarma": for k in sorted(kayit, key=lambda x: x["zaman"]): t.append({**k, "dal_kaydi": None, "zaman_korundu": True}) return t def s1_gruplama(t): """Ortak tanimin birinci sorusu; tanimi degistirilmez.""" return all(x.get("dal_kaydi") for x in t if not x.get("birlesme")) def isi_verir(ad, dal): return dal in ad def turu_verir(ad): return "/" in ad and ad.split("/")[0] in TURLER def kayda_gider(ad): return any(p.isdigit() for p in ad.replace("/", "-").split("-")) def suzulur(ad, onek="ozellik/"): return ad.startswith(onek) YASAK = set(" ~^:?*[\\") def gecerli(ad): if not ad or ad.startswith("/") or ad.endswith("/") or "//" in ad: return "eğik çizgi konumu" if ad.startswith("-"): return "tire ile başlıyor" if any(c in YASAK for c in ad): return "yasak karakter" if ".." in ad or "@{" in ad or ad.endswith(".lock"): return "yasak dizi" if any(p.startswith(".") for p in ad.split("/")): return "nokta ile başlayan parça" return "geçerli" def onek_cakismasi(adlar): return [(a, b) for a in adlar for b in adlar if a != b and b.startswith(a + "/")] kayit = gelisim() T = {b: tumlestir(kayit, b) for b in BICIMLER} print(f"kurgu: {len(kayit)} işleme, {len(DALLAR)} dal; ad düzeni kurguyu da " f"altı sorunun tanımını da değiştirmez") print() print(f"{'ad düzeni':<22s}{'addan iş':>9s}{'addan tür':>10s}" f"{'iş kaydı':>9s}{'önekle süzülen':>15s}") for ad, kume in DUZENLER.items(): print(f" {ad:<20s}{sum(isi_verir(kume[d], d) for d in DALLAR):7d}/3" f"{sum(turu_verir(kume[d]) for d in DALLAR):8d}/3" f"{sum(kayda_gider(kume[d]) for d in DALLAR):7d}/3" f"{sum(suzulur(kume[d]) for d in DALLAR):15d}") print() print(f"{'biçim':<24s}{'ad düzeni':<20s}{'dal kaydı':<10s}{'addan iş':>9s}" f"{'grup okunur':>12s}") okunur = 0 for b in BICIMLER: kayit_var = s1_gruplama(T[b]) for ad, kume in DUZENLER.items(): n = sum(isi_verir(kume[d], d) for d in DALLAR) g = kayit_var and n == len(DALLAR) okunur += g print(f" {b:<22s}{ad:<20s}{('var' if kayit_var else 'yok'):<10s}" f"{(str(n) + '/3') if kayit_var else '-':>9s}" f"{('evet' if g else 'hayır'):>12s}") print(f"birinci soru: dal kaydı {sum(s1_gruplama(T[b]) for b in BICIMLER)}" f" / {len(BICIMLER)} biçimde var; grup okunur " f"{okunur} / {len(BICIMLER) * len(DUZENLER)} satırda") print() ADAYLAR = ("ozellik/olcum", "ozellik olcum", "ozellik/olcum~1", "ozellik/..olcum", "ozellik/olcum.lock", "ozellik//olcum", "-olcum", "ozellik/olcum@{1}") print(f"{'aday ad':<24s}sonuç") for a in ADAYLAR: print(f" {a:<22s}{gecerli(a)}") KUME = ("ozellik", "ozellik/olcum", "ozellik/rapor", "ozellik/kimlik") print(f"\nönek çakışması: {len(onek_cakismasi(KUME))} çift — " f"ozellik adı ozellik/ altındaki üç dalla birlikte var olamaz")
kurgu: 12 işleme, 3 dal; ad düzeni kurguyu da altı sorunun tanımını da değiştirmez
ad düzeni addan iş addan tür iş kaydı önekle süzülen
serbest 0/3 0/3 0/3 0
kısa ad 3/3 0/3 0/3 0
türe göre 3/3 3/3 0/3 3
türe ve kayda göre 3/3 3/3 3/3 3
biçim ad düzeni dal kaydı addan iş grup okunur
birlestirme islemesi serbest var 0/3 hayır
birlestirme islemesi kısa ad var 3/3 evet
birlestirme islemesi türe göre var 3/3 evet
birlestirme islemesi türe ve kayda göre var 3/3 evet
ileri sarma serbest yok - hayır
ileri sarma kısa ad yok - hayır
ileri sarma türe göre yok - hayır
ileri sarma türe ve kayda göre yok - hayır
birinci soru: dal kaydı 1 / 2 biçimde var; grup okunur 3 / 8 satırda
aday ad sonuç
ozellik/olcum geçerli
ozellik olcum yasak karakter
ozellik/olcum~1 yasak karakter
ozellik/..olcum yasak dizi
ozellik/olcum.lock yasak dizi
ozellik//olcum eğik çizgi konumu
-olcum tire ile başlıyor
ozellik/olcum@{1} yasak dizi
önek çakışması: 3 çift — ozellik adı ozellik/ altındaki üç dalla birlikte var olamaz
Sayıların Okunması
Üst tablo dört düzeni alan alan karşılaştırıyor. Serbest adlar dört ölçütün dördünde de
sıfır veriyor: yeni, deneme ve duzeltme adlarından hangisinin hangi işe ait olduğu
çıkarılamıyor. Üçüncü ad özellikle seçildi — duzeltme bir tür adı gibi görünüyor ama ayraç
taşımadığı için tür sayılmıyor, ve gösterdiği iş kimlik, yani ad yalnız susmuyor, yanlış
yönlendiriyor.
Kısa ad düzeni ilk sütunu 3/3 yapıyor ve tek başına en büyük sıçramayı burada kazandırıyor. Tür öneki ikinci sütunu açıyor ve önekle süzülen sütununu 0’dan 3’e çıkarıyor; süzmenin koşulu adın işi vermesi değil, ortak bir önek taşımasıdır. İş kaydı alanı yalnız dördüncü düzende var ve yalnız üçüncü sütunu açıyor. Her alan bir sütun açıyor, hiçbiri iki sütun açmıyor: alanlar birbirinin yerine geçmiyor.
Orta tablo dersin ana ölçüsü. Sekiz satırın 3’ünde grup okunuyor ve okunmayan beş satır iki ayrı nedenden okunmuyor.
Dört satır dal kaydının yokluğundan düşüyor. İleri sarma biçiminde dört ad düzeninin dördü de aynı sonucu veriyor, çünkü ad tarihçeye hiç girmiyor: dal adı yalnız dal yaşadığı sürece vardır, dal silindiğinde yok olur ve tarihçede ondan geriye bir iz kalmaz. En özenli adlandırma düzeni bile kayıt tutulmayan bir biçimde sıfır katkı yapar.
Beşinci satır adın boşluğundan düşüyor. Birleştirme işlemesi biçiminde dal kaydı var;
tarihçe üç grubu ayırt ediyor ve s1_gruplama bu satırda da evet diyor. Ama kaydın taşıdığı
ad yeni, deneme ve duzeltme. Kaydın varlığı grubun sınırını verir, adı ise grubun
adını verir; ikincisi olmadan tarihçe “bu on iki işleme üç gruba ayrılıyor” der ve
grupların ne olduğunu söylemez. Ölçünün söylediği tam olarak budur: dal kaydı 1/2 biçimde
var, ama grup 3/8 satırda okunuyor.
Sekiz satırlık kümede ölçülebilen en küçük fark 1/8’dir. Kayıt kaybının bedeli 4/8, ad kaybının bedeli 1/8; ikisi aynı büyüklükte değildir ve sıralamaları tersine çevrilemez. Kayıt tutmayan bir biçimde adlandırma düzeni tartışmasının karşılığı yoktur; kayıt tutan bir biçimde ise düzenin bedeli tek bir satırdır ve o satır ödenmezse kaydın kendisi yarı yarıya boşa gider.
Alt tablo adın biçim kurallarını veriyor. Sekiz adaydan 1’i geçerli, 7’si dört ayrı nedenle reddediliyor. Reddedilenlerin hiçbiri bir yazım kusuru değil; her biri adın ya kabukla ya aracın başvuru sözdizimiyle çakıştığı bir yerde duruyor. Son satırdaki 3 çakışma ise düzenin kendi içinden gelen tek kısıttır: bir öneki dal adı olarak kullanmak, o önek altındaki her adı imkânsız kılar.
Özet
- Dal adı hem
refs/headsaltındaki bir yol hem insan için bir bildirimdir; eğik çizgi bu yolda bir hiyerarşi basamağı kurar ve desenle süzmeyi mümkün kılar. - Ad düzeni üç alan taşıyabilir — tür, iş kaydı, kısa ad — ve ölçümde her alan yalnız bir ölçütü açar: alanlar birbirinin yerine geçmez.
- Sekiz bileşimin 3’ünde grup okunur; düşen beş satırın 4’ü dal kaydının yokluğundan, 1’i adın hiçbir şey söylememesinden düşer.
- Kayıt tutmayan bir tümleştirme biçiminde ad tarihçeye hiç girmez ve adlandırma düzeninin katkısı 0’dır; kayıt tutan biçimde düzensiz ad kaydın yarısını boşa çıkarır.
- Sekiz aday addan 1’i geçerlidir; reddedilenler kabuk imleriyle ve aracın başvuru sözdizimiyle çakışır, ve bir önek dal adı olarak kullanıldığında altındaki 3 ad birden engellenir.
Sonraki Adım
Ad, bir işlemeler kümesini bir işe bağlayan şeydir; kayıt onun sınırını, düzen onun anlamını
taşır. İkisi de HEADin bir dal adını göstermesine dayanır — önceki derslerde kurulan
zincir üç halkalıydı: HEAD bir dal adını, dal adı bir işleme kimliğini, işleme kendi
öncülünü gösterir. Peki orta halka çıkarsa? HEAD bir dal adı yerine doğrudan bir işleme
kimliğini gösterdiğinde yapılan işlemeler hiçbir dala bağlanmaz. Sonraki ders bu durumun
nasıl oluştuğunu, orada yapılan işlemenin altı sorunun hangilerinin dışına düştüğünü ve
tarihçenin kaybettiğini bilmediği hâlde nasıl yanıt vermeyi sürdürdüğünü ölçer.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.