Skip to content

Latest commit

 

History

History
executable file
·
139 lines (104 loc) · 8.07 KB

refspec.asc

File metadata and controls

executable file
·
139 lines (104 loc) · 8.07 KB

Специфікація посилань (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 [email protected]: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