Клонирование репозитория mercurial, .hgsub ссылается на мертвый внешний подраздел

#mercurial

#mercurial

Вопрос:

Мы пытаемся клонировать репозиторий Mercurial A, где он ссылается на репозиторий B, который переместил хосты. Мы хотели бы обновить .hgsub в A, чтобы указать на новое местоположение B, но это проблема с курицей и яйцом, если мы не можем hg клонировать A в первую очередь.

Кто-нибудь знает, как обойти это?

Ответ №1:

 $ hg help subrepos
...

    Remapping Subrepositories Sources
    ---------------------------------

    A subrepository source location may change during a project life,
    invalidating references stored in the parent repository history. To fix
    this, rewriting rules can be defined in parent repository "hgrc" file or
    in Mercurial configuration. See the "[subpaths]" section in hgrc(5) for
    more details.

$ man hgrc
...

   subpaths
       Defines subrepositories source locations rewriting rules of the form:

       <pattern> = <replacement>

       Where  pattern  is  a regular expression matching the source and replacement is the replacement string used to
       rewrite it. Groups can be matched in pattern and referenced in replacements. For instance:

       http://server/(.*)-hg/ = http://hg.server/1/

       rewrites http://server/foo-hg/ into http://hg.server/foo/.

       All patterns are applied in definition order.

...
  

Итак, вы можете сделать это .hgrc в [subpaths] разделе.

Комментарии:

1. Я тоже не знал, как это сделать, поэтому ответ точно показывает, как я его нашел. hg help и man являются отличными утилитами.

Ответ №2:

Сначала обратите внимание, что clone — это init pull update и что клонирование подраздела является частью шага обновления, а не шага извлечения. Это означает, что вы можете избежать сбоя при клонировании, просто пропустив шаг обновления:

 $ hg clone -U <url>
  

Теперь проблема сводится к «как мне обновить до версии с проблемным файлом .hgsub /.hgsubstate?» Здесь есть две возможности:

  • переназначение вложенных репозиториев с помощью функции [вложенные пути] (см. Подраздел справки hg и конфигурацию справки hg)

  • обновление и исправление вручную

«Обновление вручную» можно выполнить следующим образом:

 $ hg revert -a -r default -X problematic-file
[adding a bunch of files]
$ hg debugrebuildstate -r default
  

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

Кроме того, смотрите эту тему списка рассылки по теме: http://markmail.org/thread/ktxd2rsm7avkexzr

Ответ №3:

Возможно, было бы проще изменить DNS в качестве быстрого обходного пути (например, файл hosts в Windows), а затем исправить .hgsub.