Объединение разрозненных проектов с репозиториями в одно решение с помощью hg? - PullRequest
4 голосов
/ 25 марта 2011

Я запустил два разрозненных проекта в 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?

Ответы [ 3 ]

3 голосов
/ 25 марта 2011

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

Чтобы сделать это, просто перейдите в 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 иони перейдут в суб-репо.

3 голосов
/ 25 марта 2011

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

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

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

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

0 голосов
/ 25 марта 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 Wiki

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

    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
...