Git: Правильный способ изменения Active Branch в открытом репозитории?

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

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

Я попытался сделать git checkout <otherbranch> в каталоге repo .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.

Ответ 1

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

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 есть, если у вас есть прямой доступ к удаленному репо.

Ответ 2

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

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

Ответ 3

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

Сначала перечислите все ссылки в голом репозитории, выполнив

$find ref

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

$git symbolic-ref HEAD

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

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

Почувствуйте это. Наслаждайтесь.

Ответ 4

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

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

в новый локальный репозиторий, хотя manpage говорит, что это только для не-голых репозиториев.

Ответ 5

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

git symbolic-ref HEAD refs/heads/mybranch

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