git объединяет ветки в голом репозитории

Я хотел бы создать следующую настройку для своих репозиториев git:

В настоящее время у меня есть локальный репозиторий git со всеми моими рабочими файлами. Я хотел бы иметь возможность настроить центральный голый репозиторий и два других не голых репозитория - один для живого приложения и один для тестовой версии.

Я хотел бы иметь возможность вносить изменения из локального в центральное голое репо в тестовой ветке. Затем в моем тестовом репозитории всегда извлекайте из тестовой ветки голого репозитория.

Когда я буду готов к работе с изменениями, я хотел бы иметь возможность объединить мою тестовую ветку и мою главную ветку в центральном пустом репозитории. Тогда живое репо может вытащить из основной ветки.

Таким образом, в этой схеме тестовое репо всегда будет извлекаться из тестовой ветки, а живое репо всегда будет извлекаться из основной ветки.

Я не могу понять, как объединить ветки в голом репозитории. git-merge и git-checkout не работают без рабочего дерева.

Итак, мой вопрос двоякий:

  1. Есть ли стандартный способ объединить ветки в голом репо?
  2. Разве это не прямолинейно, потому что мои репозитории плохо настроены? (В таком случае, как бы вы изменили эту архитектуру в соответствии с лучшими практиками?)

person user480029    schedule 02.11.2011    source источник
comment
Я именно так и нахожусь, сценарий, который вы описываете, самый распространенный.   -  person Jose Manuel Gomez Alvarez    schedule 14.09.2016


Ответы (3)


git checkout проверяет ветку в рабочем дереве — как, по-вашему, это должно было работать без рабочего дерева? А git merge и большинство других команд не работают, потому что внутри голого репозитория нет HEAD.

Чтобы ответить на ваш вопрос: вы не работаете в голом репозитории. Голый репозиторий предназначен только для хранения данных; если вы хотите работать с ним, используйте не голый клон.

Таким образом, из любого другого репозитория вы извлекаете данные из пустого репозитория, выполняете локальное слияние и отправляете свои изменения обратно в него. Вы должны сделать это из своего репозитория разработки, кстати. так что живой и тестовый репозитории извлекаются только из своей ветки.

person poke    schedule 02.11.2011
comment
Спасибо! Я сделаю слияние в своем локальном репо. - person user480029; 02.11.2011

Обратите внимание, что на самом деле это можно сделать на голом репо, но вам придется обойти обычный интерфейс.

$ git read-tree -i -m branch1 branch2
$ COMMIT=$(git commit-tree $(git write-tree) -p branch1 -p branch2 < commit message)
$ git update-ref mergedbranch $COMMIT
person kleptog    schedule 07.03.2016
comment
Этот ответ выглядит очень полезным, но он также очень запутан, что он делает. Каково общее объяснение того, что происходит, когда вы запускаете это? Что такое branch1, branch2, -i, -m, -p и mergedbranch? - person CervEd; 28.05.2021

Вы должны сначала клонировать из голого репозитория, объединить свою ветку, а затем снова нажать на голый репозиторий. Потому что у вас нет рабочего дерева на голых репозиториях для разрешения конфликтов.

person Mark K.    schedule 14.05.2012