Как отправить определенные наборы изменений в репозиторий с общей библиотекой в ​​Mercurial? - PullRequest
3 голосов
/ 08 октября 2010

У меня есть репо с именем MySharedLib и другое репо с именем MyProject. MySharedLib включен во многие различные репозитории путем принудительного вытягивания (как джедай) и НЕ использует подпункты.

Если вы клонируете MyProject, у вас останется следующая структура:

/MyProject
    MySharedLib
    OtherStuff
    Files...

MySharedLib не является вложенным запросом. Получение изменений из MySharedLib так же просто, как и запуск:

hg pull -f path/to/MySharedLib.

Но если внести изменения в / MyProject / MySharedLib, какой самый простой / стандартный способ отправить ТОЛЬКО эти изменения в репозиторий MySharedLib?

MQ? HG экспорт? HG Diff? HG трансплантации? Насколько я понимаю, почти все эти варианты работают (некоторые вместе, некоторые отдельно), но я бы хотел получить направление.

И что тогда произойдет, если разработчик сделает коммит, который включает в себя другие файлы, кроме тех, которые находятся в MySharedLib? Очевидно, этого следует избегать, но мне просто любопытно.

Ответы [ 2 ]

7 голосов
/ 08 октября 2010

Вот ограничения, которые управляют тем, что вы можете нажать:

  • вы можете толкать только целые наборы изменений - если вы фиксируете какие-то изменения вместе, все или ничего на фронте подталкивания, вы не можетеразбить набор изменений после его фиксации
  • вы не можете выдвинуть набор изменений, не переместив все его наборы изменений предка в

Так что после того, как вы зафиксировали линейную историю, подобную этой:

[0]---[1]----[2]-----[3]

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

И если набор изменений один содержит изменениядля обоих / MyProject / OtherStuff и / MyProject / MySharedLib / вы должны объединить их вместе.

Ваша единственная гибкость наступает прежде, чем вы совершите коммит, где вы можете контролировать:

  • что входит вchangeset
  • каковы родители набора изменений (которые также должны быть добавлены с ним)

Так что, если ваша история в настоящее время выглядит так:

[0]---[1]

а также hg status показывает что-то вроде этого:

M MyProject/OtherStuff/file1
M MyProject/OtherStuff/file2
M MyProject/MySharedLib/file3
M MyProject/MySharedLib/file4

Затем вы хотите создать новый набор изменений, который содержит только те изменения для MySharedLib, которые вы хотите отправить:

hg commit --include MyProject/MySharedLib

создание вашей историивыглядят так:

[0]----[1]-----[2]

и затем, перед тем, как фиксировать изменения в OtherStuff, вы не хотите нажимать, вы делаете hg update, чтобы изменить текущую ревизию parent, чтобы ваш новый набор изменений имелродитель одного вместо двух:

hg update 1

Теперь, когда вы сделаете:

hg commit

ваш новый набор изменений, три, будет иметь только изменения не-MySharedLib и родитель одного, так что ваша история будет выглядеть так:

[0]-----[1]--------[2]
          \
           --------[3]

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

Это говорит о том, что всеобщее правильно: ваше использование не просто странно, это неправильно.Вы должны посмотреть на настройку subrepo.Это почти наверняка достигает ваших целей лучше, чем то, что вы или я только что описали.

2 голосов
/ 08 октября 2010

Ух, какая странная установка. Как вы предотвращаете передачу изменений в MySharedLib в MyProject? Как вообще появляются файлы из MySharedLib, если вы не сделали слияние после их извлечения? Как только вы выполните слияние, репозитории объединяются, и вам нужно будет дополнительно использовать hg convert (как описано в этом вопросе о разделении репозиториев ), чтобы снова их разделить.

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

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