Git: Правильний спосіб змінити Active Branch у голому сховищі?


195

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

Питання в тому, як я можу правильно змінити Активну гілку ? Я міг би просто зламати 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файл.


ІМО, ви просто принципово намагаєтеся зробити The Wrong Thing тут. Якщо ви хочете, щоб гілка за замовчуванням була чимось іншим, ніж головна, тоді ця гілка повинна бути головним. Крім того, використовуйте два різних сховища.
Ніколас Найт

12
Як це принципово намагається зробити неправильну справу тут? Голий сховище підтримує декілька гілок. Я використовую оголене сховище як резервне копіювання до мого локального сховища, і як таке дзеркальне відображення гілок. У мене є майстер з обох та галузь розвитку на обох. Якщо я хочу побачити журнал гілки розвитку на голому сховищі, мені доведеться зламати файли - схоже, що git тут принципово неправильний щодо підтримки голої сховища.
Cthutu

15
@NicholasKnight IMHO ви принципово помиляєтесь тут. Немає нічого особливого в тому, що "master" як назва гілки, це лише за замовчуванням. У репозиторіях, які підтримують, у нас немає головного відділення, оскільки "майстер" не має сенсу для компанії. Щоразу, коли ми робимо випуск, ми створюємо нову гілку обслуговування з новим номером випуску і призначаємо її як активну гілку.
Spacemoose

@NicholasKnight Хоча я ціную, звідки ти родом, це перший SO Q / A, який розповів мені, як перейти до майстра! У мене було перше репо на гілці функцій, коли я робив голий клон, а наступні клони з цього голого репо були дефолтом до цієї гілки замість господаря.
Варбо

1
Нічого собі - це питання просто працює і працює - це мій бомбардир репутації №1! Справа в тому, що "майстер" полягає в тому, що це просто ім'я, і ​​якщо це не має сенсу для вашої організації, команди, проекту, фази і будь-якого іншого, тоді вибирайте щось, що підходить, щоб коли ваші співробітники клонували репо, вони негайно перемикаються до гілки, яку ви, як менеджер конфігурації, хочете, щоб вони були. Раніше я працював з ClearCase (bletch!), Тож ваш вибір був "головним", "головним" або "головним". Юк.
кбро

Відповіді:


280

Якщо у вас є доступ до віддаленого голого репо, ця стаття пропонує :

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
Дякую! У мене є прямий доступ до віддаленого голого репо, тому git-symbolic-ref зробить роботу. Мені подобається трюк із загальним предком, згаданий на іншій нитці, хоча - безумовно, один для нижнього ящика. Я витратив віки на Googling за це, але не зміг знайти вашу попередню відповідь, але "git remote head master" вважає це хітом другого за висотою рейтингу, трохи нижче git-remote (1). Химерність. Просто показує, як важко знайти щось, коли ти не знаєш, що саме шукаєш.
кбро

git symbolic-ref HEAD refs/heads/mybranchпрацював просто чудово для мене! ДЯКУЮ! ;)
vinzenzweber

1
Я дуже ціную це питання, бо випадково перевірив іншу галузь, ніж майстер, і тепер мені довелося це виправити.
Джоні Кращий

Це не працює для мене. Як не дивно, навіть якщо віддалена ГОЛОВА в голому репо тепер показує правильну гілку, git ПОСЛУГА перекладає мене на іншу гілку, коли я клоную з неї!
Магнус

@Magnus, що було б добре запитати на новій сторінці.
VonC

3

Для зміни гілки вам потрібно змінити посилання HEAD на гілку, яку ви хочете використовувати.

Спочатку перерахуйте всі посилання в голому сховищі, виконуючи це

$find ref

Тоді знайдіть посилання на свою філію, формат буде наступним refs/heads/<my_branch>. Отже наступним кроком є ​​перевірка поточної посилання, просто введіть:

$git symbolic-ref HEAD

тож ви знаєте, яка є поточна гілка, а потім оновіть її за потребою.

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

Тант це. Насолоджуйтесь.


2

Як правильно змінити Активну гілку?

  • status: git checkout у каталозі repo .git повертається фатально: цю операцію потрібно виконати у робочому дереві

  • поради: просто додайте аргумент --work-tree tree

докладний приклад: припущення: голий git на віддаленому сервері:

~ / bare_git_repository.git відокремлене робоче дерево: / var / www / myappremote

на локальному сервері: створити відділення версії.1.7 (наша інша галузь)

версія гіта git.1.7

версія походження git push.1.7

на віддаленому сервері з git bare repo:

$ cd ~ / bare_git_repository.git

$ git гілка

  • головна
    версія.1.7

Як зазначено, слідуючи команді

git checkout версія.1.7

повернення

фатально: цю операцію потрібно виконати в робочому дереві

Використовуючи наступну команду

git --work-tree = / var / www / myappremote версія оформлення замовлення.1.7

успішно змінити Активну гілку

$ git гілка

майстер

  • версія.1.7

перевірити результати за допомогою наступного

ll / var / www / myappremote

сподіваюся, що це допоможе


Це дуже просте рішення працювало для мене, дякую! Одна примітка: мені довелося створити порожній каталог робочого дерева вручну, щоб команда була успішно виконана.
Joël Esponde

-1

Крім того, якщо у вас немає доступу до голого сховища, виконайте команду a git remote set-headі ви закінчите

Дивіться цю попередню відповідь


-3

У мене також є голе репо на нашому сервері і вдалося успішно отримати файли за допомогою

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

до нового локального сховища, навіть якщо в manpage написано, що це стосується лише неочищених сховищ.


1
Хоча те, що ви говорите, є істинним, той факт, що ви використовуєте -b для вибору певної гілки, порушує вашу відповідь у контексті мого запитання, а саме як встановити гілку DEFAULT.
кбро

-4

Я порівнював два каталоги до і після застосування

git symbolic-ref HEAD refs/heads/mybranch

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


2
Існують тонкі проблеми з порушеннями, які можна ввести, безпосередньо редагуючи файли Git ref. Я настійно не рекомендую проти цього. Команди сантехніки простіші та безпечніші, ніж безпосередньо редагування посилань.
Ален О'Деа

2
Яка перевага цього @boryn?
Алекс Чемберлен

2
Git відстежує багато речей у фоновому режимі, як історію реф. Якщо ви вручну зміните файл, він не буде зареєстрований. Це правда, що це, мабуть, не має значення. Але якщо ви втратите відстеження деяких комісій і хочете їх знайти, ви будете щасливішими, якщо ви не просто "зламали" файл.
qwerty9967

Я використав команду. Але ця відповідь була корисною, щоб зрозуміти, як вона працює, і, зокрема, зрозуміти, що реф / голова - це щось внутрішнє, і я не повинен це міняти, лише остання частина "шляху". Отже, я проголосував, бо вважаю, що це все-таки цінна інформація.
Майк Кескінов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.