Git: Правильный способ изменить Active Branch в пустом хранилище? - PullRequest
182 голосов
/ 21 июля 2010

У меня есть пустой репозиторий, который используется в качестве центрального хранилища для моего проекта. Все разработчики делают git clone <repo>, чтобы поделиться с ним. Когда они делают клон, они получают извлечение главной ветви (если они не делают git clone -n), потому что repo.git/HEAD содержит ref: refs/heads/master, что делает Активная ветвь .

Вопрос в том, как правильно изменить Active Branch ? Я мог бы просто взломать файл repo.git/HEAD напрямую, но это кажется неприятным и, ну, в общем, взломанным.

Я пытался сделать git checkout <otherbranch> в каталоге репо .git, но это не удалось, потому что я не был в рабочем дереве.

Я попытался git update-ref HEAD refs/heads/otherbranch, но это только что обновило refs /heads / master так, чтобы оно совпадало с refs /heads / otherbranch (хорошо, я сделал это в фиктивном репозитории, а не в моем производственном!)

Я пытался git update-ref --no-deref HEAD refs/heads/otherbranch, и это почти сработало. Он обновил файл HEAD, но установил его в SHA1 коммита, на который указывает refs/heads/otherbranch.

Я тестирую с git-версией 1.7.0.2.msysgit.0.

Я предполагаю, что нет способа сделать это через git push, так как позволить всем и каждому изменить ветку по умолчанию кажется немного небезопасным (!), Но, безусловно, есть лучший способ сделать это в репо .git каталог, чем непосредственно взломать файл HEAD.

Ответы [ 6 ]

263 голосов
/ 21 июля 2010

Если у вас есть доступ к удаленному репо, эта статья предлагает :

git symbolic-ref HEAD refs/heads/mybranch

, который обновит файл HEAD в вашем хранилище так, чтобы он содержал:

ref: refs/heads/mybranch

как указано в git-symbolic-ref


Если у вас нет доступа к удаленному репо, см. мой предыдущий ответ .


Помните, что такая команда, как git remote set-head:

  • не меняет ветку по умолчанию для удаленного репо.
    Это только изменяет ветку удаленного отслеживания , сохраненную в вашем локальном репо, на refs/remotes/<name>/HEAD

  • не меняет HEAD сам (опять же, только refs/remotes/<name>/HEAD), следовательно, необходимость git symbolic-ref.

Так что git remote set-head - это не ответ здесь.
git symbolic-ref HEAD, если у вас есть прямой доступ к удаленному репо.

3 голосов
/ 06 октября 2016

Чтобы изменить ветку, вам нужно изменить ссылку HEAD на ветку, которую вы хотите использовать.

Сначала перечислите все ссылки в пустом хранилище, выполнив

$find ref

Затем найдите ссылку для вашей ветки, формат будет следующим: refs/heads/<my_branch>. Следующий шаг - проверить текущую ссылку, просто наберите:

$git symbolic-ref HEAD

чтобы вы знали, какая ветка является текущей, а затем обновите ее при необходимости.

$git sumbolic-ref HEAD ref/heads/<my_branch>

Да, это так. Наслаждайтесь.

0 голосов
/ 11 апреля 2019

А как насчет фарфоровой команды git reset --soft <branch_name> на git-сервере в голом хранилище? Он также должен изменить ГОЛОВУ.

0 голосов
/ 19 декабря 2015

У меня также есть пустое хранилище на нашем сервере, и я смог успешно извлечь файлы, используя

git clone //server/repo/directory -b branch_name

, в новый локальный репозиторий, хотя на странице руководства указано, что это только для непрошенных репозиториев.

0 голосов
/ 20 марта 2014

Кроме того, если у вас нет доступа к пустому хранилищу, выполните git remote set-head, и все готово

См. Предыдущий ответ

0 голосов
/ 16 апреля 2011

Я сравнил два каталога до и после применения

git symbolic-ref HEAD refs/heads/mybranch

, и оказалось, что был изменен только файл repo.git / HEAD, так что, вероятно, довольно безопасно просто взломатьфайл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...