Объединение разрозненных проектов с репозиториями в единое решение с помощью hg?

Я начал два разных проекта в Visual Studio 2010, каждый со своим репозиторием hg.

Позже я решил, что два проекта принадлежат одному решению и, следовательно, одному репозиторию hg.

Новое решение имеет следующую файловую структуру:

SolutionFolder
   |---.hg
   +---Lib
   |    ∟ dlls
   +---Source
   |    ∟ Project_A
   |      ∟--.hg  
   |    ∟ Project_B
   |      ∟--.hg
   +---OverarchingSolution.sln

Есть ли способ, которым я могу >объединить наборы изменений Project_A и Project_B в хранилище папки решения?

Таким образом, в результате:

SolutionFolder
   |---.hg
   +---Lib
   |    ∟ dlls
   +---Source
   |    ∟ Project_A
   |    ∟ Project_B
   +---OverarchingSolution.sln

Со всеми наборами изменений от Project_A и Project_B в репозитории SolutionFolder?


person leeand00    schedule 25.03.2011    source источник
comment
Хм, документация здесь выглядит многообещающе: mercurial.selenic.com/wiki/MergingUnrelatedRepositories В разделе, который читает переименование   -  person leeand00    schedule 25.03.2011
comment
Я собираюсь добавить два ответа ниже, потому что есть два разных способа сделать это, и я могу придумать, какой из них лучше, чем тот, который вы нашли в вики.   -  person Ry4an Brase    schedule 25.03.2011
comment
Вы можете проверить этот очень похожий вопрос SO: stackoverflow.com/questions/5420149/   -  person jwd    schedule 25.03.2011


Ответы (3)


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

Для этого нужно просто перейти в SolutionFolder и создать файл с именем .hgsub, содержащий следующие строки:

Source/Project_A = Source/Project_A
Source/Project_B = Source/Project_B

затем вы запускаете эти команды (все еще в SolutionFolder):

hg init
hg add .hgsub
hg commit -m 'new repo with two sub repos'

После этого вы можете выполнять большинство обычных команд Mercurial в папке решений (status, commit и т. д.) с дополнительным аргументом --subrepos, и они будут каскадироваться во вложенных репозиториях.

person Ry4an Brase    schedule 25.03.2011
comment
Да, я забыл об этом, спасибо за напоминание. Я использовал его восемь месяцев назад, и он работает очень хорошо. - person leeand00; 25.03.2011

Если вы согласны с изменением истории (т. е. с отменой всех остальных клонов этого проекта), вы можете использовать расширение «конвертировать».

Создадим текстовый файл, назовем его rename-map-a.txt вот эта строчка в нем:

rename . Source/Project_A

Затем войдите в Source и запустите:

hg convert --filemap rename-map-a.txt Project_A new-Project_A

Повторите тот же процесс для B, чтобы теперь у вас было:

SolutionFolder
   |---.hg
   +---Lib
   |    ∟ dlls
   +---Source
   |    ∟ Project_A
   |      ∟--.hg  
   |    ∟ Project_B
   |      ∟--.hg
   |    ∟ new-Project_A
   |      ∟--.hg  
   |    ∟ new-Project_B
   |      ∟--.hg
   +---OverarchingSolution.sln

Затем войдите в SolutionFolder и выполните следующие команды:

hg init   # creates a new, empty repo
hg pull Source/new-Project_A   # pulls in changesets from A
hg pull --force Source/new-Project_B   # pulls in changesets from A

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

SolutionFolder/Source/Project_A/.hg
SolutionFolder/Source/Project_B/.hg
SolutionFolder/Source/new-Project_A
SolutionFilder/Source/new-Project_B

оставив вам именно то, что у вас есть в качестве цели в вашем вопросе, и со всей историей и всем отслеживаемым. Тем не менее, см. мой другой ответ, что я считаю лучшей идеей.

person Ry4an Brase    schedule 25.03.2011

Один из способов сделать это — извлечь из несвязанного репозитория, используя hg pull -f. Это приведет к тому, что репозиторий будет иметь несколько корней. У вас останется история из обоих репозиториев, которая будет представлена ​​двумя линиями разработки в репозитории.

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

Итак, для вашего случая я бы представил что-то вроде этого:

    C:\> move SolutionFolder\Source\Project_A Temp_Project_A
    C:\> cd Temp_Project_A
    C:\Temp_Project_A> mkdir Source\Project_A
    C:\Temp_Project_A> hg rename * Source\Project_A
    C:\Temp_Project_A> hg ci -m "moved all Project_A files down in preparation for combining repos"
    C:\Temp_Project_A> cd ..\SolutionFolder
    C:\SolutionFolder> hg pull -f ..\Temp_Project_A
    C:\SolutionFolder> hg merge
    C:\SolutionFolder> hg ci -m "merged Project_A repo into main one"

    (and similar for Project B)

Ознакомьтесь с разделом, начинающимся с «Возможно получение из совершенно не связанного репозитория...» в Mercurial. Вики

Вот общий пример с реальным выводом:

    C:\>hg ini repoA

    C:\>hg ini repoB

    C:\>cd repoA

    C:\repoA>echo FOO > foo.txt

    C:\repoA>hg add
    adding foo.txt

    C:\repoA>hg ci -m "added foo in repo A"

    C:\repoA>cd ..\repoB

    C:\repoB>echo BAR > bar.txt

    C:\repoB>hg add
    adding bar.txt

    C:\repoB>hg ci -m "added bar in repo B"

    C:\repoB>cd ..

    C:\>hg clone repoA combinedRepo
    updating to branch default
    1 files updated, 0 files merged, 0 files removed, 0 files unresolved

    C:\>cd combinedRepo

    C:\combinedRepo>hg pull -f ..\repoB
    pulling from ..\repoB
    searching for changes
    warning: repository is unrelated
    adding changesets
    adding manifests
    adding file changes
    added 1 changesets with 1 changes to 1 files (+1 heads)
    (run 'hg heads' to see heads, 'hg merge' to merge)

    C:\combinedRepo>hg merge
    1 files updated, 0 files merged, 0 files removed, 0 files unresolved
    (branch merge, don't forget to commit)

    C:\combinedRepo>hg ci -m "merged repoB into repoA"

    C:\combinedRepo>hg gl
    @    changeset:   2:3d08641554c5
    |\   tag:         tip
    | |  parent:      0:bc6a6ad6a3e5
    | |  parent:      1:54dc5af30c7a
    | |  user:        j.w.
    | |  date:        Fri Mar 25 10:12:32 2011 -0700
    | |  summary:     merged repoB into repoA
    | |
    | o  changeset:   1:54dc5af30c7a
    |    parent:      -1:000000000000
    |    user:        j.w.
    |    date:        Fri Mar 25 10:11:43 2011 -0700
    |    summary:     added bar in repo B
    |
    o  changeset:   0:bc6a6ad6a3e5
       user:        j.w
       date:        Fri Mar 25 10:11:15 2011 -0700
       summary:     added foo in repo A
person jwd    schedule 25.03.2011