Змініть дистанційну HEAD Git, щоб вказати на щось, крім головного


124

Як встановити посилання HEAD дистанційного керування Git, щоб вказати на щось, крім "master"?

Мій проект має політику не використовувати "головну" гілку (всі гілки мають значущі назви). Крім того, до канонічного основного сховища доступно лише через ssh: //, без доступу до оболонки (наприклад, GitHub або Unfuddle).

Моя проблема полягає в тому, що віддалене сховище все ще має посилання HEAD на refs / heads / master, але мені це потрібно, щоб вказати на іншу гілку. Це спричиняє дві проблеми:

  1. Під час клонування РЕПО, це

    попередження: віддалений HEAD посилається на неіснуючий номер, не в змозі оформити замовлення.

    Це заплутано і незручно.

  2. Веб-браузер кодового браузера залежить від HEAD як основи для перегляду дерева. Тоді мені потрібна HEAD, щоб вказати на дійсну гілку.


Просто додано одну можливість для запису, але не підходить для вашої справи.
VonC

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

12
FWIW, оскільки ви згадали про GitHub у питанні - якщо ви хочете змінити посилання HEAD на GitHub, просто перейдіть до екрана "Адміністратор" сховища та змініть спадне меню "Відділення за замовчуванням" на ту галузь, на яку ви хочете вказувати HEAD.
Джо

Дивіться також help.github.com/articles/…
Тіно,

Відповіді:


63

Рік тому у GitHub було майже таке ж питання .

Ідея полягала в тому, щоб перейменувати головну галузь:

git branch -m master development
git branch -m published master
git push -f origin master 

Виготовлення майстра має те, що ви хочете, щоб користувалися людьми, і виконуйте всі інші роботи у галузях.

(" git-symbolic-ref HEAD refs/head/published" не поширюватиметься на віддалений репо)

Це схоже на " Як видалити джерело / майстер у Git ".


Як сказано в цій темі : (наголос мій)

" git clone" створює лише одну локальну гілку.
Для цього він дивиться на HEAD refвіддалене репо і створює локальну гілку з такою ж назвою, як віддалена гілка, на яку вона посилається.

Отже, щоб завершити це, у вас є репо А і клонуйте його:

  • HEADпосилання refs/heads/masterта що існує
    -> ви отримуєте локальну гілку під назвою master, починаючи з походження / master

  • HEAD посилання, refs/heads/anotherBranchі що існує
    -> ви отримуєте локальну гілку, що називається anotherBranch, починаючи зorigin/anotherBranch

  • HEAD посилання refs/heads/masterта цього не існує
    -> "git clone" скаржиться

Не впевнений, чи є який-небудь спосіб безпосередньо змінити HEADпосилання на репо-репо .

(в чому полягає вся суть вашого питання, я знаю;))


Можливо, єдиним способом буде "публікація для бідних" , де ви:

 $ git-symbolic-ref HEAD refs/head/published
 $ git-update-server-info
 $ rsync -az .git/* server:/local_path_to/git/myRepo.git/

Але це передбачало б доступ запису до сервера, що не завжди можливо.


Як я пояснюю в " Git: Правильний спосіб змінити активну гілку в голому сховищі? ", git remote set-headНічого не змінилося на віддаленому репо.

Це змінило б лише відділення віддаленого відстеження, що зберігається локально у вашому місцевому репо, в remotes/<name>/HEAD.


Спасибі, VonC. Я прочитав це перед публікацією тут. Але, як бачите, галузь під назвою "майстер" не бажана в цьому проекті з технічних та політичних міркувань.
JasonSmith

Потім ви можете застосувати цю політику, заборонивши будь-яке оновлення в головній гілці через гачок, що попередньо здійснює.
VonC

Так, якщо виявиться, що немає способу зробити те, що я хочу, я зроблю саме це і прийму вашу відповідь. Дякуємо за продовження!
JasonSmith

Дякуємо за оновлення. На даний момент я використав трюк "не-звичайний предк", щоб зробити головну гілку лише з одним комітом. (Тобто: git гілка -D master; echo ref: refs / heads / master> .git / HEAD; rm *). Потім я просто торкнувся файлу під назвою GO_AWAY, і повідомлення про фіксацію пояснює ситуацію. Це буде працювати зараз. Я можу перевірити джерело та простежити, де приймальна сторона встановлює HEAD для остаточної відповіді.
JasonSmith

1
@ctn Це просто тому, що я забув варіант -f( --force). Відповідь я відредагував відповідно. Тоді відповідь на вашу посилання використовує той самий варіант.
VonC

42

Оновлення: це працює лише для локальної копії сховища ("клієнт"). Будь ласка, дивіться коментарі інших нижче.

З останньою версією git (лютий 2014 р.) Правильною процедурою було б:

git remote set-head $REMOTE_NAME $BRANCH

Так, наприклад, перемикання голови на віддалений originдо гілки developбуде:

git remote set-head origin develop


Чи потрібна ця функція останньої версії git на сервері чи її достатньо, якщо на клієнтській машині встановлено нещодавній git?
Мікко Ранталайнен

3
@Totor короткий, але правильний; цю відповідь слід оскаржити. Git має це дещо заплутане поняття "локальна гілка за замовчуванням для віддаленого". Це дозволяє вводити "origin" замість "origin / defaultbranch" і є чистою стороною від клієнта . Довга історія на сайті git-scm.com/docs/git-remote # set-head
березня 1616

1
щоб підтвердити те, про що говорить @MarchH: запустіть git checkout -b default; git push origin HEAD; git remote set-head origin default. Потім ви можете ознайомитись з локальними змінами за допомогою cat .git/refs/remotes/origin/HEAD(це повинно бути ref: refs/remotes/origin/default) та відсутністю віддалених змін з git remote show origin(все одно буде все, що було до того, як ви додали гілку за замовчуванням).
De Novo

37

Оскільки ви згадуєте GitHub, щоб зробити це на їхньому сайті, просто увійдіть у ваш проект, тоді ...

admin > Default Branch > (choose something)

Зроблено.


1
Відмінно! Це був останній відсутній шматочок.
berkus

Моє походження / HEAD вже вказує на функціональну гілку замість головного. Я намагався змінювати "головну гілку" вперед і назад, але це не вплинуло на ГОЛОВУ ... Будь-які пропозиції?
Даніїл Шевельов

3
Налаштування> Відділення> Відділення за замовчуванням
Chun Yang

12

Побачити: http://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

Це встановлює гілку за замовчуванням у сховищі git. Ви можете запустити це в голих або дзеркальних сховищах.

Використання:

$ git symbolic-ref HEAD refs/heads/<branch name>

6
$ git символічний-ref HEAD refs / heads / name-of-branch
Lamy

Я це робив у віддаленому репо, і це вирішило мої проблеми з клонуванням, де з певних причин голова була іншим ім'ям гілки, і тому намагання клонувати майстра призведе до помилки при спробі закрити майстра композитора, це може бути дуже специфічним для цього сценарію , але інші можуть опинитися в такому положенні і цікавитись, що робити
Крістофер Томас

10

(В основному вже було те саме питання " створити символічний перегляд git у віддаленому сховищі ", на яке не було отримано універсальної відповіді.)

Але є конкретні відповіді для різних git "ферм" (де кілька користувачів можуть керувати git repos через обмежений інтерфейс: через http та ssh): http://Github.com , http://Gitorious.org , http: / /repo.or.cz , Girar ( http://git.altlinux.org ).

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


4
Тепер у них є спадне меню для вибору гілки HEAD на сайті repo.or.cz (наприклад: repo.or.cz/editproj.cgi?name=for-me-and-for-all_imz.git ) та gitorious.org , теж. Чудово!
imz - Іван Захарящев

7

Якщо у вас є доступ до віддаленого репо з оболонки, просто перейдіть до .git (або головного режиму, якщо це голий репо) і змініть файл HEAD, щоб вказати на правильну голову. Наприклад, за замовчуванням він завжди містить 'refs: refs / heads / master', але якщо вам потрібен foo, щоб бути HEAD замість цього, просто відредагуйте файл HEAD і змініть його на 'refs: refs / heads / foo'.


У мене є адміністраторські права на сервері Git, і я зробив саме те саме. Ми використовуємо Gitolite, і я зайшов до сховища, яке я створив. Назва каталогу - myrepo.git. Вміст файлу HEAD у вказаному каталозі змінено з ref: refs/heads/masterна ref: refs/heads/mainline. Тепер, коли я намагаюся клонувати сховище в моєму локальному вікні, він все ще вказує на майстра. Я керував git clone ssh://gitolite@git.server/myrepoкомандою. Будь-яка ідея для такої поведінки?
Technext

Версія сервера Git: git version 1.7.1І клієнтська версія Git:git version 1.9.4.msysgit.2
Technext

5

Ви можете створити відокремлену головну гілку, використовуючи лише порцелянові команди Git:

git init
touch GO_AWAY
git add GO_AWAY
git commit -m "GO AWAY - this branch is detached from reality"

Це дає нам головну гілку з грубим повідомленням (можливо, ви хочете бути більш ввічливим). Тепер ми створюємо нашу "справжню" гілку (назвемо її стовбур на честь SVN) і розлучаємо її з майстром :

git checkout -b trunk
git rm GO_AWAY
git commit --amend --allow-empty -m "initial commit on detached trunk"

Гей, престо! gitk - всі покажуть майстер і магістраль без зв’язку між ними.

«Магія» тут полягає в тому, що --amend змушує git počin створити новий комітет з тим же батьків, що і поточний HEAD, а потім зробити HEAD вказівкою на нього. Але поточна HEAD не має батьківського типу, оскільки це початкова фіксація у сховищі, тому нова HEAD також не отримує жодної, що робить їх відірваними один від одного.

Стара команда HEAD не видаляється git-gc, оскільки refs / heads / master все ще вказує на неї.

Прапор --пустіть-порожній потрібен лише тому, що ми робимо порожнє дерево. Якщо після git rm були деякі додавання git, то це було б не потрібно.

По правді кажучи, ви можете створити відокремлену гілку в будь-який час, розгалужуючи початкову комісію в сховищі, видаляючи її дерево, додаючи відірване дерево, потім виконуючи git commit --amnd .

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


1
Ви можете створити відокремлену гілку простіше, отримавши незв’язану гілку з іншого репо і надавши їй ім’я. Наприклад, git fetch git:user@example.com:foo remote-branch-name && git checkout -b detached-branch FETCH_HEADдодамо нову гілку, detached-branchяка відповідає гілці remote-branch-nameу віддаленому git:user@example.com:foo. Звичайно, "віддалений" може бути сховищем у локальній файловій системі, яку ви підготували раніше.
Мікко Ранталайнен

2

Спочатку створіть нову гілку, яку ви хочете встановити за замовчуванням, наприклад:

$>git branch main

Далі, натисніть цю гілку до початку :

$>git push origin main

Тепер, коли ви ввійдете у свій обліковий запис GitHub, ви можете перейти до вашого сховища та вибрати Налаштування> Відділення за замовчуванням та вибрати " головне ".

Потім, якщо ви вирішите, ви можете видалити головну гілку:

$>git push origin :master


Ключовим моментом, який потрібно зрозуміти, є те, що якщо ваш хостинг-провайдер (GitHub у цьому прикладі) не надає метод для зміни гілки за замовчуванням, вам не пощастить. Протокол Git не забезпечує можливість зміни віддаленої гілки за замовчуванням; вам потрібно мати змогу запускатись git symbolic-refна віддаленій оболонці або іншим чином змінювати текстовий файл, викликаний HEADу кореневому каталозі віддаленого сховища.
Мікко Ранталайнен

2

Пов'язане з питанням, я опинився тут під час пошуку:

Як зробити так, щоб місцеве репо усвідомило змінену гілку за замовчуванням на GitHub

Для повноти додавання відповіді:

git remote set-head origin -a

0

Для людей з гітолітом гітоліт підтримує команду під назвою - чекай - symbolic-ref. Це дозволяє запускати цю команду віддалено, якщо у вас є дозвіл W (write) на репо.


-1

Просто увійдіть у свій обліковий запис GitHub і в крайній правій частині в навігаційному меню виберіть Налаштування , на вкладці Налаштування виберіть Відділення за замовчуванням і поверніться на головну сторінку вашого сховища, яка зробила для мене фокус.


1
Хоча вона показує нову гілку як за замовчуванням в інтерфейсі GitHub, коли роблю клон git [repo], я не отримую цю гілку. тобто .git / HEAD містить неправильну посилання.
Джозеф Шеді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.