Ртутные хранилища - PullRequest
       20

Ртутные хранилища

1 голос
/ 07 ноября 2011

У меня есть вопрос по поводу суперпозиториев. Наш проект настроен так:

+ projectA
    + some files
    + dependencyA
        + some files

dependencyA является вложенным хранилищем. Он был создан так:

  1. cd projectA
  2. зависимость mkdirA
  3. зависимость от CDA
  4. рт.ст. init
  5. hg pull ssh: // hg @ somerandomiphere / dependencyA
  6. кд ..
  7. эхо-зависимостьA = ssh: // hg @ somerandomiphere / dependencyA> .hgsub
  8. рт.ст. Добавить
  9. hg commit
  10. рт.ст. push

Если я внесу изменения в суперпозиторий, то зафиксирую их и вытолкну из основного проекта. Оба они будут отправлены на сервер, так как он рекурсивный. Теперь мой коллега хочет вытащить изменения с сервера. Но поскольку в основном проекте ничего не изменилось, это не сработает. Но если я изменю что-то в основном проекте и перенесу это на сервер. После hg pull он получит новейшую ревизию, а если он сделает hg update, то он также обновит субпозиторий. Это ожидаемое поведение.

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

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Субпозиторий в Mercurial wiki, p.2.5 «Pull»

Команда «pull» по умолчанию не является рекурсивной.Это связано с тем, что Mercurial не будет знать, какие подпункты требуются, пока не будет запрошено обновление для определенного набора изменений.Обновление будет извлекать запрошенные подпапки и наборы изменений по требованию.Чтобы получить pull и выполнить обновление за один шаг, используйте команду «pull --update».

Обратите внимание, что это точно соответствует принципу «pull» без использования субпозитариев, учитывая, что субпозитории находятся в рабочем каталоге:

  • 'hg pull' предоставляет вам наборы изменений в восходящем потоке, но не влияет на ваш рабочий каталог.
  • 'hg update' обновляет содержимое вашего рабочего каталога (как в верхнем репо, так и во всех подпунктах)

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

0 голосов
/ 08 ноября 2011

То, что было предложено выше, работает так, как я и думал. Настоящей проблемой был мой способ создания под-репозитория.

Вместо:

  1. cd projectA
  2. MkDir
  3. Зависимость A
  4. зависимость от CDA
  5. рт.ст. init
  6. hg pull ssh: // hg @ somerandomiphere / dependencyA

Это должно было быть просто:

  1. hg клон ssh: // hg @ somerandomiphere / dependencyA dependencyA

Как мы знаем, .hgsusbtate заблокирует вложенный репозиторий на определенной ревизии после фиксации. Это то, что произошло, но (!) Выполнение hg pull в под-репозитории завершилось с ошибкой

paths cannot contain dot file components

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

Решение:

клонирование - это путь, по которому нужно идти

...