Упродовж цієї книги, ми користувались простими відображеннями віддалених гілок до локальних посилань, проте вони можуть бути набагато складнішими. Припустімо, ви виконували команди кількох останніхх секцій, і створили невеличке локальне 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