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 +
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.
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.
Note
|
Refspec’i bir repodan almak ve başka bir repoya itmekte kullanamazsınız. Bunu yapacak bir örnek için ch06-github.asc bölümüne başvurabilirsiniz. |
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