Измените Git remote HEAD таким образом, чтобы он указывал на что-то, кроме master
-
18-09-2019 - |
Вопрос
Как мне настроить головную ссылку Git remote так, чтобы она указывала на что-то, кроме "master"?
В моем проекте действует политика не использовать "главную" ветвь (все ветви должны иметь осмысленные имена).Кроме того, главный репозиторий canonical доступен только через ssh://, без доступа к оболочке (например, GitHub или Unfuddle).
Моя проблема в том, что в удаленном репозитории все еще есть ссылка HEAD на refs / heads / master, но мне нужно, чтобы она указывала на другую ветвь.Это вызывает две проблемы:
При клонировании репозитория существует это,
предупреждение:удаленный ЗАГОЛОВОК ссылается на несуществующую ссылку, которую невозможно оформить.
Это сбивает с толку и неудобно.
Веб-браузер кода зависит от HEAD как основы для просмотра дерева.Тогда мне нужно, чтобы HEAD указывал на действительную ветвь.
Решение
Там было почти то же самое тот же вопрос на GitHub год назад.
Идея состояла в том, чтобы переименовать главную ветвь:
git branch -m master development
git branch -m published master
git push -f origin master
Сделайте так, чтобы у master было то, что вы хотите, чтобы люди использовали, и выполняйте всю остальную работу в филиалах.
(а "git-symbolic-ref HEAD refs/head/published
" не будет распространен на удаленное репо)
Это похоже на "Как мне удалить origin / master в Git".
Как сказано в этот поток:(курсив мой)
"
git clone
" создает только один локальный филиал.
Чтобы сделать это, он смотрит наHEAD ref
удаленного репозитория и создает локальную ветвь с тем же именем, что и удаленная ветвь, на которую он ссылается.Итак, чтобы завершить это, у вас есть репозиторий A и клонируйте его:
HEAD
ссылкиrefs/heads/master
и это существует
-> вы получаете локальную ветвь под названием master, начиная с origin / masterСсылки на заголовки
refs/heads/anotherBranch
и это существует
-> вы получаете местное отделение под названиемanotherBranch
, начиная сorigin/anotherBranch
Ссылки на заголовки
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 remote set-head
это ничего бы не изменило в удаленном репозитории.
Это изменило бы только ветку удаленного отслеживания, хранящуюся локально в вашем локальном репозитории, в remotes/<name>/HEAD
.
Другие советы
Обновить: Это работает только для локальной копии репозитория ("клиент").Пожалуйста, ознакомьтесь с комментариями других пользователей ниже.
С последней версией git (февраль 2014) правильная процедура была бы:
git remote set-head $REMOTE_NAME $BRANCH
Так, например, переключение головки на пульте дистанционного управления origin
к ответвлению develop
было бы:
git remote set-head origin develop
Поскольку вы упомянули GitHub, тогда, чтобы сделать это на их сайте, просто зайдите в свой проект...
admin > Default Branch > (choose something)
Выполнено.
Видишь: http://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html
Это устанавливает ветвь по умолчанию в репозитории git.Вы можете запустить это в открытых или зеркальных репозиториях.
Использование:
$ git symbolic-ref HEAD refs/heads/<branch name>
(Там уже был в основном тот же вопрос "создайте символическую ссылку git в удаленном репозитории", на который не было получено универсального ответа.)
Но есть конкретные ответы для различных "ферм" git (где несколько пользователей могут управлять репозиториями git через ограниченный интерфейс:через http и ssh): http://Github.com, http://Gitorious.org, http://repo.or.cz, Girar (http://git.altlinux.org).
Эти конкретные ответы могут быть полезны для тех, кто читает эту страницу и думает об этих конкретных услугах.
- Теперь у них есть выпадающее меню для выбора головной ветви в http://repo.or.cz (пример: http://repo.or.cz/editproj.cgi?name=for-me-and-for-all_imz.git);
- и в http://gitorious.org, тоже (посмотрите где-нибудь в настройках);
- и в http://GitHub.com:администратор> Ветка по умолчанию> (выберите что-нибудь) (благодаря ответу @srcspider);
- С тех пор как версия 2.6, ветвь по умолчанию может быть установлена в Веб-интерфейс в разделе "Проекты" > "Список" > > "Филиалы".В версии 2.12 Геррит добавлена новая команда set-head это может быть используется через ssh.
- и в Girar (работает на http://git.altlinux.org для сборки пакетов для дистрибутива ALT), можно использовать ssh-интерфейс для этого:
$ ssh git.alt help | fgrep branch default-branch <path to git repository> [<branch>] $
напримерssh git.alt default-branch packages/autosshd.git sisyphus
чтобы изменить ЗАГОЛОВОК в удаленном репозиторииautosshd.git
чтобы указать наsisyphus
филиал.
Если у вас есть доступ к удаленному репозиторию из командной строки, просто зайдите в .git (или в основной каталог, если это простое репозиторий) и измените файл HEAD, чтобы он указывал на правильный head.Например, по умолчанию он всегда содержит 'ссылки:refs/heads /master', но если вам нужно, чтобы foo был вместо этого заголовком, просто отредактируйте файл HEAD и измените содержимое на 'refs:ссылки / головы/foo'.
Вы можете создать отдельный мастер ветвь, использующая только фарфоровые команды 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 - все покажет мастер и багажник без какой-либо связи между ними.
"Магия" здесь заключается в том, что --внести поправки причины git совершить чтобы создать новый коммит с тем же родительским элементом, что и текущий заголовок, затем сделайте так, чтобы ЗАГОЛОВОК указывал на него.Но у текущего HEAD нет родительского элемента, поскольку это начальный коммит в репозитории, поэтому новый HEAD также его не получает, что делает их отделенными друг от друга.
Старый головной коммит не удаляется с помощью git-gc-мерзавец потому что refs / heads / master все еще указывает на это.
В --разрешить-пустой флаг нужен только потому, что мы фиксируем пустое дерево.Если бы там были какие - то git добавитьэто после того , как мерзавец rm тогда в этом не было бы необходимости.
По правде говоря, вы можете создать отдельную ветку в любое время, разветвив начальную фиксацию в репозитории, удалив ее дерево, добавив свое отдельное дерево, затем выполнив git commit - изменить.
Я знаю, что это не отвечает на вопрос о том, как изменить ветку по умолчанию в удаленном репозитории, но это дает четкий ответ о том, как создать отдельную ветку.
Сначала создайте новую ветку, которую вы хотели бы установить по умолчанию, например:
$>git branch main
Затем подтолкните эту ветвь к происхождение:
$>git push origin main
Теперь, когда вы входите в свою учетную запись GitHub, вы можете перейти в свой репозиторий и выбрать Настройки> Ветвь по умолчанию и выбрать "Главная."
Затем, если вы того пожелаете, вы можете удалить главную ветвь:
$>git push origin :master
Для пользователей gitolite gitolite поддерживает команду с именем -- wait для нее -- symbolic-ref
.Это позволяет вам запускать эту команду удаленно, если у вас есть разрешение W (на запись) в репозиторий.
В связи с вопросом, я оказался здесь при поиске:
Как мне сообщить локальному репозиторию об измененной ветке по умолчанию на GitHub
Для полноты картины добавляю ответ:
git remote set-head origin -a
Просто войдите в свою учетную запись GitHub и в правой части навигационного меню выберите Настройки, в Вкладка " Настройки" выбирай Ветвь по умолчанию и вернитесь обратно на главную страницу вашего репозитория, которая сделала свое дело за меня.