Git
Chapters ▾ 2nd Edition

10.5 Git зсередини - Специфікація посилань (refspec)

Специфікація посилань (refspec)

Упродовж цієї книги, ми користувались простими відображеннями віддалених гілок до локальних посилань, проте вони можуть бути набагато складнішими. Припустімо, ви виконували команди кількох останніхх секцій, і створили невеличке локальне Git сховище, а тепер хочете додати до нього віддалене сховище:

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

Ця команда додає секцію до файлу .git/config вашого сховища, яка задає ім’я віддаленого сховища (origin), його URL, та специфікацію посилань, що використовуватиметься для отримання змін:

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

Формат специфікації — необов’язвокий перший +, за яким слідує <src>:<dst>, де <src> — це шаблон для посилань віддаленого сховища, а <dst> — під яким локальним ім’ям Git стежитиме за цим посиланням. + каже Git оновлювати посилання, навіть якщо буде не швидке перемотування вперед.

У типовому випадку, який автоматично записує команда git remote add, Git отримує всі посилання під refs/heads/ з віддаленого сховища та записує їх до refs/remotes/origin/ локально. Отже, якщо на сервері існує гілка master, то ви матимете доступ до журналу цієї гілки локально за допомогою будь-якого з таких варіантів:

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

Всі ці команди еквівалентні, оскільки Git розкриває кожен до refs/remotes/origin/master.

Якщо ви бажаєте, щоб Git натомість отримував щоразу лише master, а не всі інші гілки з віддаленого сервера, то можете змінити рядок fetch, щоб там була вказана лише ця гілка:

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

Це типова специфікація для git fetch для цього віддаленого сховища. Якщо ви бажаєте зробити щось лише для одного отримання змін, ви також можете задати конкретну специфікацію в командному рядку. Щоб отримати гілку master з віддаленого сховища до локального origin/mymaster, ви можете виконати:

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

Ви також можете задати декілька специфікацій посилань. У командному рядку, ви можете отримати декілька гілок наступним чином:

$ 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

У даному випадку, отримання гілки master було відхилено, для неї не дозволено перемотування вперед. Це можна змінити: треба додати + на початку специфікації.

Ви також можете задати декілька специфікацій для отримання у своєму конфігураційному файлі. Якщо ви бажаєте завжди отримувати гілки master та experiment з віддаленого сховища origin, додайте два рядки:

[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

Ви не можете використовувати часткові шаблони, отже наступне не буде чинним:

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

Втім, ви можете використовувати простори імен (або директорії), для досягнення подібного. Якщо у вас є команда QA, яка надсилає низку гілок, та ви бажаєте отримати гілку master та будь-які з гілок QA, проте нічого більше, то можете використати таку секцію конфігурації:

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

Якщо у вас складний процес роботи, який включає надсилання гілок командою QA, розробниками, та командою інтеграції, і всі вони взаємодіють за допомогою віддалених гілок, ви можете легко додати простори імен таким чином.

Специфікації надсилання посилань

Мати можливість отримувати посилання в просторах імен таким чином зручно, проте, як команді QA створити свої гілки у просторі qa/ щоб це працювало? Ви можете цього досягнути за допомогою надсилання специфікацій посилань.

Якщо команда QA бажає надіслати свою гілку master до qa/master на віддаленому сервері, то може виконати

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

Якщо вони бажають, щоб Git це робив автоматично щоразу під час виконання git push origin, то можуть додати значення push до файлу конфігурації:

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

Знову, це призведе до того, що git push origin типово надсилатиме гілку master до віддаленої гілки qa/master.

Вилучення посилань

Ви також можете використовувати специфікацію посилань для вилучення посилань з віддаленого сховища за допомогою чогось схожого на:

$ git push origin :topic

Через те, що специфікація це <src>:<dst>, якщо відкинути частину <src>, то, по суті, це каже зробити віддалену гілку topic нічим, тобто вилучити її.

Чи можете використати новіший синтаксис (доступний від Git версії 1.7.0):

$ git push origin --delete topic