Git 🌙
Chapters ▾ 2nd Edition

10.5 Dahili Git Ögeleri - Refspec

Refspec

Kitabın tamamında, uzak dallardan yerel referanslara basit eşlemeler kullandık, ancak bunlar daha karmaşık olabilir. Son birkaç bölümü takip edip küçük bir yerel Git reposu oluşturduysanız ve şimdi ona bir uzak repo eklemek istiyorsanız:

$ git remote add origin https://github.com/schacon/simplegit-progit

Yukarıdaki komutu çalıştırmak, repo .git/config dosyanıza bir bölüm ekler. Bu bölüm, uzak repo adını (origin), uzak repo adresini ve alım için kullanılacak refspec 'i belirtir:

[remote "origin"]
	url = https://github.com/schacon/simplegit-progit
	fetch = +refs/heads/*:refs/remotes/origin/*

Refspec’in formatı, öncelikle isteğe bağlı bir "" içerir, ardından <src>:<dst> gelir; burada <src> uzak taraftaki referanslar için desen ve <dst> bu referansların yerel olarak izleneceği yerdir. "" Git’e, hızlı ileri-sarma olmasa bile referansın güncellenmesini bildirir.

Git git remote add origin komutuyla otomatik (varsayılan) olarak sunucudaki refs/heads/ altındaki tüm referansları alır ve bunları yerel olarak refs/remotes/origin/ 'e yazar. Dolayısıyla sunucuda master dalı varsa, bu dala yerel olarak aşağıdakilerden herhangi biri aracılığıyla erişebilirsiniz:

$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master

Git her birini refs/remotes/origin/master 'a genişlettiği için hepsi eşdeğerdir.

Eğer Git’in her seferinde yalnızca master dalını çekmesini ve uzak sunucudaki diğer tüm dalları değil değiştirmesini istiyorsanız, alım satırını sadece o dala referans gösterecek şekilde değiştirebilirsiniz:

fetch = +refs/heads/master:refs/remotes/origin/master

Bu o uzak reponun git fetch komutu için varsayılan refspec’tir. Bir defalık bir çekme yapmak istiyorsanız, özel refspec’i komut satırında da belirtebilirsiniz. Uzak sunucudaki master dalını yerel olarak origin/mymaster'a çekmek için şunu çalıştırabilirsiniz:

$ git fetch origin master:refs/remotes/origin/mymaster

Ayrıca birden fazla refspec belirtebilirsiniz. Komut satırında, birkaç dalı şu şekilde indirebilirsiniz:

$ git fetch origin master:refs/remotes/origin/mymaster \
	 topic:refs/remotes/origin/topic
From git@github.com:schacon/simplegit
 ! [rejected]        master     -> origin/mymaster  (non fast forward)
 * [new branch]      topic      -> origin/topic

Burada bir hızlı ileri-sarma referansı olarak listelenmediği için master dalının çekilmesi reddedildi. Bunu, refspec’in önüne {plus} belirterek geçersiz kılabilirsiniz.

Ayrıca, yapılandırma dosyanızda çekme için birden fazla refspec belirtebilirsiniz. Her zaman origin uzak sunucusundan master ve experiment dallarını almak istiyorsanız, iki satır ekleyin:

[remote "origin"]
	url = https://github.com/schacon/simplegit-progit
	fetch = +refs/heads/master:refs/remotes/origin/master
	fetch = +refs/heads/experiment:refs/remotes/origin/experiment

Desende kısmi globlar kullanamazsınız, yoksa bu geçersiz olur:

fetch = +refs/heads/qa*:refs/remotes/origin/qa*

Ancak, bunun gibi bir şeyi başarmak için ad-alanlarını (veya dizinleri) kullanabilirsiniz. Eğer bir dizi dalı iten bir QA ekibiniz varsa ve siz master dalıyla QA ekibinin dallarından herhangi biri dışında hiçbiryerden çekme yapmak istemiyorsanız, şu şekilde bir yapılandırma bölümü kullanabilirsiniz:

[remote "origin"]
	url = https://github.com/schacon/simplegit-progit
	fetch = +refs/heads/master:refs/remotes/origin/master
	fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*

Eğer bir QA ekibi, geliştiriciler ve entegrasyon ekiplerinin uzak dalları itip işbirliği yaptığı, karmaşık bir iş akışı süreciniz varsa, hepsini bu şekilde kolayca ad-alanına çekebilirsiniz.

Refspec’leri İtmek

Ad-alanlı referansları bu şekilde alabilmeniz güzel, ancak QA ekibi dallarını qa/ ad-alanına nasıl alır? Bunu, refspecs’i itmek için kullanarak başarırsınız.

Eğer QA ekibi master dalını uzak sunucuda qa/master'a itmek istiyorsa, şunu çalıştırabilirler:

$ git push origin master:refs/heads/qa/master

Her seferinde git push origin çalıştıklarında Git’in bunu otomatik olarak yapmasını istiyorlarsa, yapılandırma dosyalarına bir push değeri ekleyebilirler:

[remote "origin"]
	url = https://github.com/schacon/simplegit-progit
	fetch = +refs/heads/*:refs/remotes/origin/*
	push = refs/heads/master:refs/heads/qa/master

Tekrar belirtmek gerekirse, bu yapılan varsayılan olarak yerel master dalının uzak qa/master dala itilmesine neden olacaktır.

Not

Refspec’i bir repodan almak ve başka bir repoya itmekte kullanamazsınız. Bunu yapacak bir örnek için GitHub’taki Herkese Açık Repolarınızı Güncel Tututun bölümüne başvurabilirsiniz.

Referansları Silmek

Ayrıca, şuna benzer bir şey çalıştırarak refspec’i uzak sunucudan referansları silmek için kullanabilirsiniz:

$ git push origin :topic

Refspec <src>:<dst> olduğundan, <src> kısmını kırparak, uzak sunucudaki topic dalını hiçbir şeye getirebilirsiniz (yani silersiniz).

Ya da daha yeni sözdizimini kullanabilirsiniz (Git v1.7.0’dan itibaren kullanılmaktadır):

$ git push origin --delete topic
scroll-to-top