Git
Chapters ▾ 2nd Edition

10.5 Git’in Daxili İşləri - Refspec

Refspec

Bu kitab boyunca uzaq branch-lardan yerli referanslara qədər sadə xəritələrdən istifadə etdik, lakin daha mürəkkəb ola bilər. Tutaq ki, son cüt bölmələri ilə birlikdə izlədiniz və kiçik bir yerli Git deposu yaratdınız və indi ona bir remote əlavə etmək istəyirsiniz:

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

Yuxarıdakı əmri işə salmaq, depolarınızın .git/config faylına bir bölmə əlavə edir, pultun adını (origin), remote deponun URL-ini və gətirmək üçün istifadə ediləcək refspec qeyd edir:

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

Refspecin formatı, əvvəlcə istəyə bağlı bir + ardından <src>:<dst>, burada <src> remote tərəfdəki referanslar üçün nümunədir və <dst> olduğu yerdir və bu referanslar yerli olaraq izləniləcəkdir. + Git-ə sürətli irəliləməsə də referansı yeniləməsini söyləyir.

Avtomatik olaraq bir git remote add origin əmri ilə yazılan varsayılan vəziyyətdə, Git serverdəki refs/heads/ altındakı bütün referansları götürür və yerli olaraq refs/remotes/origin/ yazır. Beləliklə, serverdə bir master branch-ı varsa, aşağıdakılardan hər hansı biri ilə həmin branch-ın jurnalına daxil ola bilərsiniz:

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

Hamısı ekvivalentdir, çünki Git hər birini refs/remotes/origin/master-ə genişləndirir.

Bunun əvəzinə Git’in remote serverdəki digər branch-ları deyil, yalnız master branch-ını hər dəfə pull down istəyirsinizsə, gətirmə xəttini yalnız bu branch-a istinad etmək üçün dəyişə bilərsiniz:

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

Bu, həmin remote üçün git fetch üçün yalnız standart refspecdir. Yalnız birdəfəlik gətirmək istəyirsinizsə, komanda xəttində də xüsusi refspeci göstərə bilərsiniz. Uzaqdakı master branch-nı local olaraq origin/mymaster-a çəkmək üçün işlədə bilirsiniz:

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

Ayrıca birdən çox spesifikasiya təyin edə bilərsiniz. Əmr sətrində belə bir neçə branch-ı pull down bilərsiniz:

$ 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

Bu vəziyyətdə, sürətli master istinad kimi göstərilmədiyi üçün master branch pull etməsi rədd edildi. Refspecin qarşısındakı + işarəsini göstərərək bunu ləğv edə bilərsiniz.

Konfiqurasiya faylınızda əldə etmək üçün birdən çox refspecs də göstərə bilərsiniz. Həmişə origin remote-undan masterexperiment branch-larını almaq istəyirsinizsə, iki sətir əlavə edin:

[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

Git 2.6.0 olduğundan, birdən çox branch-a uyğun olmaq üçün pattern-də qismən qlobuslardan istifadə edə bilərsiniz, belə ki, bu işləyir:

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

Daha yaxşısı, daha çox quruluşla eyni şeyi etmək üçün ad boşluqlarından (və ya qovluqlardan) istifadə edə bilərsiniz. Bir sıra branch-ları push edən bir QA komandanız varsa və master branch-nı və QA komandasının hər hansı bir branch-ını əldə etmək istəyirsinizsə, başqa bir şey yoxdursa, belə bir konfiqurasiya bölməsindən istifadə edə bilərsiniz:

[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/*

Bir QA komandasını branch-ları push edən, developerləri branch-ları push edən və inteqrasiya komandalarını uzaqdan branch-lara push edən və iş birliyi olan kompleks bir iş axını prosesiniz varsa, onları bu şəkildə asanlıqla adlandıra bilərsiniz.

Pushing Refspecs

Namespace referansları bu şəkildə ala biləməyiniz çox yaxşıdır, amma QA komandası ilk növbədə branch-larını qa/ namespace-ə necə çevirir? Bunu push etmək üçün refspecs istifadə edərək həyata keçirirsiniz.

QA komandası, master branch-nı remote server üzerindəki qa/master push etmək istəyirsə, bunları işlədə bilər:

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

Git’in hər dəfə git push origin işə saldıqda bunu avtomatik olaraq etməsini istəsələr, konfiqurasiya sənədlərinə bir push dəyəri əlavə edə bilərlər:

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

Yenə də bu, local bir master branch-ını default olaraq remote qa/master branch-na push etməyə səbəb olacaqdır.

Note

Refspec-i bir depodan götürüb başqa birinə push etmək üçün istifadə edə bilməzsiniz. Bunu edə biləcəyiniz bir nümunə üçün GitHub Public Depolarınızı Yeniləyin-ə müraciət edin.

Reference-ları Silmək

Remote serverdən referansları silmək üçün refspec-dən belə bir şey istifadə edərək istifadə edə bilərsiniz:

$ git push origin :topic

Refspec <src>:<dst> olduğu üçün <src> hissəsini tərk edərək, bu, əsasən topic branch-nı uzaqdan heç bir şey etməməyi tələb edir və onu silir.

Və ya daha yeni sintaksisdən istifadə edə bilərsiniz (Git v1.7.0-dan bəri mövcuddur):

$ git push origin --delete topic