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 был изменен, поэтому, вероятно, вполне безопасно просто "взломать" файл.