Git Notes: Git’in En Havalı ve En Sevilmeyen Özelliği (2022)
(tylercipriani.com)- Git notes, Git nesnelerini değiştirmeden ayrı bir ad alanında metadata eklemeyi sağlayan bir özellik olsa da, düşük kullanılabilirlik ve sınırlı benimsenme nedeniyle yaygın olarak kullanılmıyor
- Eski commit mesajlarını düzeltmek gerekmeksizin yeni bilgiler eklenebildiği için, inceleme·build·ticket bilgileri gibi otomasyon sistemlerinin bıraktığı kayıtlar için oldukça uygun
- Git projesi ve Gerrit, notes özelliğini gerçekten kullanıyor; böylece commit başına e-posta listesi tartışmaları, test sonuçları ve reviewer bilgileri
git logiçinde görülebiliyor - Google’ın git-appraise aracı, git notes üzerine dağıtık kod incelemesi kuruyor; inceleme isteği, yorum, inceleme ve birleştirme işlemleri yerelde yapılabiliyor
- GitHub, 2014’te commit notes gösterimini durdurdu; ayrıca blob·tree notes kullanmak, Git’in iç komutlarına aşina olmayı gerektirdiği için proje geçmişini dağıtma potansiyeline rağmen kullanımı zor
Git nesnelerini değiştirmeyen metadata
- Git notes, Git’in takip ettiği nesnelere ayrı metadata kaydetme özelliğidir
- Hedef yalnızca commit’ler değil, blob ve tree nesnelerini de kapsar
- Nesnenin kendisini değiştirmeden, ayrı bir ad alanına bilgi ekler
- Geçmişe girmiş commit mesajlarını güvenli biçimde sonradan düzeltmek genelde zordur; ancak notes kullanılırsa eski commit’lere de yeni bilgi eklenebilir
- Örneğin aşağıdaki gibi
git notes add -mile bir not eklenebilirgit notes add -m 'Acked-by: <tyler@tylercipriani.com>' - Ardından
git logiçinde ilgili commit’in altındaNotes:bloğu olarak görünür
- Örneğin aşağıdaki gibi
- Scott Chacon, 2010’da GitHub.blog’da notes özelliğinin, diğer geliştiricilerle konuşmaktan çok ticket·build sistemi gibi otomasyon kayıtlarını eklemek için daha uygun olduğunu söylemişti
Gerçek kullanım ve tıkanılan noktalar
- Git projesi, her commit’i e-posta listesi tartışmalarına bağlamak için notes kullanıyor
- Örnek commit’in
Notes (amlog)bölümündeMessage-Idbulunuyor ve bu değer patch tartışma thread’ine gidiyor
- Örnek commit’in
- notes; commit veya branch bazlı çalışma süresi takibi,
git logiçine inceleme·test bilgisi ekleme ve tamamen dağıtık kod incelemesi gibi amaçlarla da kullanılabiliyor - Gerrit’in reviewnotes eklentisi, kod inceleme metadata’sının Git içinde çevrimdışı görüntülenmesini sağlıyor
- notes’u çekmek ve göstermek için komutlar şöyle
git fetch origin refs/notes/review:refs/notes/review git log --show-notes=review - Gösterilen bilgiler arasında
Verified+1,Verified+2,Code-Review+2,Submitted-by,Submitted-at,Reviewed-on,Project,Branchyer alıyor
- notes’u çekmek ve göstermek için komutlar şöyle
- Google’ın git-appraise aracı, git notes üzerine kurulu “fully distributed code review” sistemidir
- GitHub ve GitLab gibi code forge platformlarından bağımsız çalışır
- Değişiklik için inceleme isteği açma, değişikliğe yorum yapma, inceleme ve birleştirme işlemleri yerel bilgisayarda yapılabilir
- Bir web arayüzü de içerir
- En büyük zayıflık kullanılabilirlik
- GitHub, 2014’te commit notes gösterimini durdurdu
- Commit notes için otomatik fetch ve
git loggösterimi,gitconfigayarlarıyla bir ölçüde kolaylaştırılabilirgit config --add \ remote.origin.fetch \ '+refs/notes/*:refs/notes/*' git config \ notes.displayRef \ 'refs/notes/*' - Blob veya tree nesnelerine notes kaydetmek için Git’in plumbing komutlarına aşina olmak gerekir
- Git, kod geçmişini dağıtır; ancak Git deposunun değerinin büyük kısmı GitHub gibi forge platformlarının içinde kilitli kalır
- git notes, yalnızca kodu değil, projenin tüm geçmişini de dağıtmanın bir yolu olabilir
1 yorum
Hacker News yorumları
Pek bilinmeyen bir başka özellik de git trailers: https://alchemists.io/articles/git_trailers
Commit oluştururken eklenebilen anahtar-değer yapısında veriler; bazı sistemler bunu metadata iliştirmek için kullanıyor. Örneğin Gerrit, Change-Id eklemek için bu özelliği kullanıyor
PostgreSQL’deki çeşitli veritabanı nesnelerine metin iliştirmenizi sağlar. PostgreSQL’de de düzenlenebilir, yapılandırılmış anahtar-değer biçiminde veritabanı nesnesi metadata’sı özelliği olsa güzel olurdu
[skip ci]koymaya alternatif olarak git trailers kullandığını yakın zamanda öğrendim; muhtemelen commit mesajını tüketen alt sistemlerde daha kolay kaldırabilmek içindir: https://docs.github.com/en/actions/managing-workflow-runs-an...Neden son trailer olmasını zorunlu tuttuğunu bilmiyorum; regex yüzünden olabilir
Açık kaynak upstream ile çalışırken branch’i
git rebase -iile kusursuzca düzenlemek istediğimde işe yarıyordu. Şimdi bu bilgiyi git trailers’a koymak daha iyi gibi görünüyor. Change-Id konusunda ise Git’in kendisinde böyle tanımlayıcılar olsa araçlar da anlayabileceği için iyi olurdu. Commit’i commit mesajıyla tanımlamak, özellikle MR’da mesaj değiştirilebildiğinde kırılgan. Commit ID commit’i benzersiz biçimde tanımlar ama aynı değişiklik başka bir commit’in üzerine taşınabiliyorsa kullanışlı bir tanımlayıcı değildir. Öte yandan trailers gerçek commit’in bir parçası, notes ise değil; bu yüzden benim kullanımım için iyi bir alternatif olmazdıCommit mesajına elle koymakla
--trailerbayrağını kullanmanın işlevsel olarak aynı olup olmadığını merak ediyorumYerelde bir instance ayağa kaldırıp GitHub’da barındırılan bir repo ile entegre etmeye çalıştım, sadece hayal kırıklığı oldu. Commit’ler arasında değişiklik takibi vb. şeyleri GitHub’dan daha iyi halleden, daha aktif geliştirilen ve GitHub entegrasyonu da daha dostane olan bir alternatif var mı merak ediyorum. GitHub’ın code review araçlarından gerçekten nefret ediyorum
Forgejo da bu yıl ocakta çıkan 10. sürümden beri destekliyor: https://forgejo.org/2025-01-release-v10-0/#new-features
https://codeberg.org/forgejo/forgejo/pulls/4753
Gerçekten harika görünüyor ama amend veya rebase gibi pratikte commit’i değiştirilmiş bir kopyasıyla değiştiren history rewrite özellikleriyle notes’un nasıl birlikte çalıştığını merak ediyorum
Notes belirli bir commit, tree veya blob ID’sine iliştiriliyor gibi geliyor.
git rebasevb.nin notes’u yeni commit’e kopyalayacak kadar akıllı olup olmadığını, yoksa basitçe kaybolup kaybolmadığını merak ediyorum. Interactive rebase’de birden çok commit’i tek commit’te squash edince ne oluyor, o da soru işareti. Blob’lara ve tree’lere notes iliştirmek de aynı soruna sahip gibi görünüyor. Depodaki bir dosyaya ya da dizine metadata iliştiriyormuşsunuz gibi hissettiriyor ama aslında belirli içeriğe iliştiriyorsunuz. Örneğin"Hello world!"dizesini içeren bir blob’a note iliştirirseniz Git bu note’u o içeriğe sahip tüm dosyalara bağlar mı? Ayrıca bir dosyayı"Hello, world!"olarak değiştirirseniz notes’u kaybeder misiniz?notes.rewriteöğesinegit-config(1)içinde bakabilirsinizGit’i herhalde yaklaşık 10 yıldır kullanıyorum ama git notes olduğunu bilmiyordum. Harika
“Tüm forge’lar code review metadata’sını Git içinde offline kullanılabilir hale getirsin” talebi, GitHub gibi ticari forge’larda pek karşılık bulmayacak gibi. Senin de dediğin gibi, Git deposunun değerinin büyük kısmı GitHub gibi forge’larda kilitli olduğu için. Kâr amaçlı şirketler genellikle kendi katma değerlerini genelleştirme konusunda hevesli olmaz. GitHub’ı suçlamak istemiyorum; harika bir hizmet ve çok cömert bir ücretsiz katman sunuyorlar, ayrıca taşınmak isterseniz API ile tüm verileri çıkarmanıza izin vermeleri açısından iyi iş çıkarıyorlar. Bu sadece ticari işletmenin doğası
Git notes, yalnızca commit zaten oluşturulup başkalarına göründükten sonra sık sık metin eklemeniz gerektiğinde harika
Acked-By ve e-posta listesi tartışma bağlantısı örnekleri pek iyi örnekler gibi değil. İkisi de commit oluşturulurken zaten biliniyor olma ihtimali yüksek şeyler. Git commit mesajlarının pratikte neredeyse uzunluk sınırı yok; dolayısıyla forge üzerinde commit hakkında yapılan tartışmayı doğrudan commit mesajının içine kopyalayabilirsiniz. Bence daha iyi bir örnek, sonradan geri alınmış bir commit’e git note eklemek olur
Tuhaf olan ben olabilirim ama kodun en başta neden yazıldığını hatırlamaya çalışırken yorumlara ya da annotate’e düzgün bakmayan çok fazla iş arkadaşı gördüm. Doğrudan değiştirip sorunun kendilerine bağlanmamasını umuyorlar. Ama sadece hata düzeltmesini bekleyen öfkeli bir müşteriyle uğraşıp çok geçmeden aynı hatanın geri geldiğini görünce hata düzeltirken daha dikkatli olabilirsiniz. Birden fazla hatayı aynı anda düzeltmek çoğu zaman refactoring gerektirir; refactoring de yeni özellik fırsatları veya performans iyileştirmeleri açabilir
Sonradan geri alınmış bir commit’i işaretlemek için commit mesajı daha iyidir. Bir dosyada blame çalıştırırsanız o dosyanın en son değişikliği görünür; bir commit başka bir commit’in değişikliğini geri aldıysa blame’de daha yeni olan revert commit’i görünür
Bu bilgi eksikliği değil, bir UI sorunu. GitHub UI notes’u gösterseydi kullanım hemen çok daha fazla artardı
“Git’in en havalı ama sevilmeyen özelliği” çok. Örneğin bisect, pickaxe, reflog, range-diff, archive, annotated tags vb.
Pek çok kişinin Git’i süslü bir Google Drive gibi görmesi ve bu özelliklerin sık sık unutulması üzücü
Yine de bence sorun değil. Unix felsefesi tek bir şeye odaklanıp onu iyi yapmaktır
LibreOffice projesinde Apache OpenOffice deposundaki her commit’i izlemek için Git notes kullanılmıştı
O depoyu LibreOffice Git deposunda bir branch olarak mirror ederken, her commit’in alakasız bir değişiklik olup olmadığını — örneğin LibreOffice’in uzun zaman önce daha iyisiyle değiştirdiği build system değişikliği mi, LibreOffice’te zaten bulunan bir değişikliğin tekrarı mı, yoksa nadiren LibreOffice’e kabul edilmişse hangi commit ile cherry-pick edildiğini — kaydediyorlardı. Hâlâ https://cgit.freedesktop.org/libreoffice/core/log/?h=aoo/tru... adresinde kendiniz görebilirsiniz; bu Git frontend’i hâlâ notes’u gösteriyor. Birkaç yıldır bu değişiklik takibini durdurdular; muhtemelen Apache OpenOffice’in değişiklik hızı çok yavaşladığı ve cherry-pick edilecek az sayıdaki değişiklikten elde edilecek fayda pek kalmadığı için
En havalı ama sevilmeyen özellikten ziyade, tüm şirketi yalnızca geliştiricilerle işleten bir ekip gibi çok belirli durumlarda havalı olabilecek bir gimmick özellike daha yakın
Gerekli olan şey commit mesajına girer; ayrı bir sistemdeki ticket’a referans vermek bug değil, feature’dır. Çünkü JIRA veya başka sistemler geliştirici olmayanlarla iletişim kurmak için kullanılır. Örneğin bir business analyst’in koda veya depoya hiç erişimi yoktur; destek ekibinin de depoya ve koda erişimi yoktur. Geliştirici olmayanların notes’u görüp düzenleyebileceği bir frontend yapılabilir ama yine de pek anlamı olmaz. BA veya destek ekipleri belirli bir commit ile ilgilenmez; bir özellik tek bir commit’e tam oturabilir ama genelde öyle olmaz. Birden fazla depo kullanıyorsanız ve tek bir özellik birden fazla servise yayılıyorsa git notes epey işe yaramaz hâle gelir; sonunda harici bir sisteme referans gerekir
Ama ana akım olan bu. Bazen aynı monorepo’yu paylaştığımız başka bir ekibin analisti, tek satır kodla hemen yanıtlanabilecek bir soruyu bana soruyor. Üstelik o analist teknik sayılır ve SQL de biliyor; kodumuz da oldukça idiomatik ve üst düzey yazılmış. Yine de kültür, içsel verimsizlik yüzünden ölmeden kendi kendini değiştiremiyor
[^1] https://news.ycombinator.com/item?id=44348438
GitLab’in notes desteği için açılmış 9 yıllık özellik isteği yakın zamanda kapatıldı: https://gitlab.com/gitlab-org/gitlab/-/issues/15029
Ne yazık ki okumak için giriş yapmak gerekiyor, ama herhangi bir gitlab.com hesabı yeterli olmalı