Перемещать файлы по вложенным репозиториям в mercurial

#mercurial

#mercurial

Вопрос:

Кто-нибудь знает, как перемещать файлы через suprepos, сохраняя историю файла

Я использую hg mv /Product/common/modules/sub-repo1/scripts/filename /Product/common/modules/sub-repo2/scripts/filename

Product является репозиторием уровня оболочки, а sub-repo1 и sub-repo2 являются вложенными репозиториями

Выдает ошибку прерывания /Product/common/modules/sub-repo2/scripts/filename not under root ..

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

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

2. хорошо, я попробую это, вернусь и обновлю.

Ответ №1:

Это возможно путем объединения двух репозиториев вместе:

  1. Конвертируйте в новое хранилище с файловой картой, которая отфильтровывает все, кроме интересующего вас файла. Есть хорошее описание наhgtip.com.

     echo include my-file > filemap
    hg convert --filemap sourcerepo temprepo
      
  2. Переместите новый репозиторий в существующий репозиторий. Это создаст совершенно новый заголовок, который не является результатом какого-либо предыдущего набора изменений. Это также более подробно описано наhgtip.com.

     cd destrepo
    hg pull --force temprepo
      
  3. Наконец, объедините новый заголовок.

     hg merge
      

Вот пример в командной строке. Сначала мы создаем репозиторий с исходным кодом:

 $ mkdir sourcerepo
$ cd sourcerepo
$ hg init
$ echo aaa > a
$ echo bbb > b
$ hg add a b
$ hg commit -m first
$ echo xxx > a
$ echo yyy > b
$ hg commit -m second
  

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

 $ cd ..
$ echo include a > filemap
$ hg convert --filemap filemap sourcerepo temprepo
initializing destination temprepo repository
scanning source...
sorting...
converting...
1 first
0 second
$ hg glog temprepo/a
@  changeset:   1:a2c44f396733
|  tag:         tip
|  user:        Laurens Holst <...>
|  date:        Fri Oct 21 13:02:53 2011  0200
|  summary:     second
|
o  changeset:   0:68090379058b
   user:        Laurens Holst <...>
   date:        Fri Oct 21 13:02:41 2011  0200
   summary:     first
  

Теперь мы создаем целевой репозиторий:

 $ mkdir destrepo
$ cd destrepo
$ echo zzz > z
$ hg add z
$ hg commit -m another
$ hg glog
o  changeset:   0:890b51ba85c6
   tag:         tip
   user:        Laurens Holst <...>
   date:        Fri Oct 21 13:15:51 2011  0200
   summary:     another
  

Наконец, мы извлекаем изменения из временного репозитория и объединяем его:

 $ hg pull --force ../temprepo
pulling from ../temprepo
searching for changes
warning: repository is unrelated
requesting all changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 1 files ( 1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m "merge file a from sourcerepo"
$ ls
a z
$ hg glog
@    changeset:   3:7becd66c019a
|   tag:         tip
| |  parent:      0:890b51ba85c6
| |  parent:      2:dc9ac503efba
| |  user:        Laurens Holst <...>
| |  date:        Fri Oct 21 13:39:51 2011  0200
| |  summary:     merge file a from sourcerepo
| |
| o  changeset:   2:dc9ac503efba
| |  user:        Laurens Holst <...>
| |  date:        Fri Oct 21 13:02:53 2011  0200
| |  summary:     second
| |
| o  changeset:   1:2a5fa6bd9021
|    parent:      -1:000000000000
|    user:        Laurens Holst <...>
|    date:        Fri Oct 21 13:02:41 2011  0200
|    summary:     first
|
o  changeset:   0:890b51ba85c6
   user:        Laurens Holst <...>
   date:        Fri Oct 21 13:15:51 2011  0200
   summary:     another
  

Теперь ваш файл из исходного репозитория объединяется в целевой репозиторий с сохранением всей истории изменений!

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

1. Хост — Что происходит с временным репозиторием?? Он все еще там висит?? Или как только я извлекаю их из целевого репозитория, они исчезают??

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

Ответ №2:

Вы не можете этого сделать.

Вам нужно выполнить это в следующие шаги:

  1. Скопируйте файл из одного репозитория в другой, используя обычные инструменты файловой системы
  2. Добавьте его в новый репозиторий через hg add
  3. Удалите файл из старого репозитория с помощью hg remove

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

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

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

1. На самом деле, вы можете это сделать, смотрите Мой ответ ниже.