Могу ли я внести изменения в несколько ртутных вложенных элементов в новую именованную ветку? - PullRequest
5 голосов
/ 17 ноября 2010

У меня есть ртутный репозиторий с несколькими вложенными репозиториями внутри. В репозитории имеется решение для визуальной студии, содержащее проекты в репозитории и в под-репозитории.

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

Затем я хочу зафиксировать изменения, но в новую именованную ветвь, поскольку она не завершена и будет объединена позже. Используя tortoiseHg, я фиксирую изменения в репозитории, указывая новую ветвь для создания. В свою очередь, фиксация фиксирует изменения в суб-репо, но в моих тестах она не создает новую ветку в своем репозитории, а просто добавляет ревизию в текущую ветку.

Я могу выполнить фиксацию в sub-repo в явном виде и указать имя ветки в то время, но я надеялся, что можно будет зафиксировать весь набор изменений в репозиториях для новых веток в каждом репозитории за один раз, чтобы мой рабочий процесс стал чище , Это возможно?

1 Ответ

6 голосов
/ 17 ноября 2010

Сначала зафиксируйте суб-репо и создайте там именованную ветвь.

После этого основной коммит должен продолжать фиксировать этот суб-репо в той же ветке, что и раньше.

Сначала вы должны думать о двух хранилищах как об отдельных, полностью обособленных. Другими словами, вы делаете что-то в одном хранилище и делаете это. Затем вы делаете что-то в другом хранилище и делаете это.

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

Другими словами, суб-хранилище само по себе не знает, что оно является частью более широкой картины. Однако главный репозиторий знает текущую извлеченную ревизию в этом под-репозитории. Это знание передается в хранилище как часть обычных коммитов.

Это означает, что если вы делаете что-то в под-хранилище, фиксируете это, теперь под-хранилище находится в новой ревизии. Когда вы позже фиксируете в главном репозитории, хеш этой новой ревизии в суб-репозитории обновляется в файле .hgsubstate, а затем фиксируется.

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

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

Итак, чтобы ответить на ваш вопрос в комментариях.

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

Сначала вы должны объединиться в под-хранилище. Это заканчивается фиксацией, что означает, что суб-репозиторий теперь находится в наборе изменений, который совершил слияние. Затем вы объединяете основной репозиторий и делаете коммит, в котором хранятся эти знания, а также набор изменений в суб-репозитории, который используется сейчас.

Так что да, вам нужно объединить оба в более поздний момент.

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