Возможно ли использование git subrepo с ДРУГИМ git subrepo в ртутном хранилище? - PullRequest
5 голосов
/ 24 марта 2011

У меня есть ртутный репозиторий, и я добавил без проблем git subrepo ( hg 1.8 ).

Проблема в том, что у этого git-подпункта есть ДРУГОЙ под-репозиторий git, и он не извлекается (он находится в файле git subrepo .gitmodules), если только я не делаю git clone --recursive в моем git-подпункте: делаю так работы.

Проблема: я делаю hg pull в своем хранилище на другом компьютере, он тянет git subrepo, но не тянет .gitmodules. .Gitmodules были извлечены только на другой машине, когда я сделал git clone --recursive.

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

Ответы [ 3 ]

3 голосов
/ 03 апреля 2011

Полагаю, что лучшим решением было бы исправление поддержки Git в Mercurial, чтобы всегда использовать рекурсивные опции Git (например, git clone --recursive при клонировании под-репозитория на основе Git, git pull --recurse-submodules && git submodule update после извлечения обновленного под-репозитория на основе Git и т. Д.),Я знаю, что разработчики Git специально решили не инициализировать субмодули автоматически, потому что один из рабочих процессов, которые они хотят поддерживать, это «Я никогда не хочу видеть ни один из субмодулей», но, возможно, «всегда инициализировать все субрепозитории» лучше подходит длярежим работы Mercurial по умолчанию (я не большой пользователь Mercurial, поэтому у меня нет четкого представления о том, каким будет стиль Mercurial по умолчанию).


Пока это не произойдет, вы можетечтобы обойти проблему, переведя записи subrepo/.gitmodules в записи .hgsub.Это легко сделать вручную, но, возможно, вы могли бы автоматизировать его, если это было важно (используйте git config, чтобы извлечь пути и URL-адреса из .git/config и / или .gitmodules).Это может быть непривлекательно, если вы имеете дело с файлом .gitmodules, который сильно меняется (вам нужно быть очень внимательным в отношении синхронизации .hgsub каждый раз, когда меняется .gitmodules).

Я проверил это с четырьмя репозиториями:

  • gitsub - «листовое» хранилище (без подмодулей Git)
  • gitsuper - «суперпроект» Git;
    gitsub/ - это gitsub в качестве подмодуля
  • hgsuper2 - суперпроект Mercurial;
    gitsuper/ - gitsuper asсуб-репозиторий,
    gitsuper/gitsub - это gitsub в качестве суб-репозитория.
  • hgsuper2-clone - клонированный «суперпроект» Mercurial;
    gitsuper/ * gitsuper в качестве вложенного репозитория,
    gitsuper/gitsub is gitsub в качестве вложенного хранилища.

Я создал и протестировал их следующим образом:

  1. Создать gitsub .Добавьте и передайте некоторый контент.
  2. Создание gitsuper .
    1. Добавить содержимое.
    2. git submodule add url-of-gitsub gitsub && git submodule init
    3. git commit -m 'added gitsub'
  3. Создать hgsuper2 .
    1. Добавить некоторый контент.
    2. git clone --recursive url-of-gitsuper gitsuper
    3. echo 'gitsuper = [git]url-of-gitsuper' >> .hgsub
    4. echo 'gitsuper/gitsub = [git]url-of-gitsub' >> .hgsub
      Эти два последних шага могут быть автоматизированы из битовgitsuper/.git/config и gitsuper/.gitmodules.
    5. hg add .hgsub && hg commit -m 'added Git subrepositories'
  4. Клон hgsuper2-клон из hgsuper2 .
    Получает соответствующее содержимое в gitsuper/ и gitsuper/gitsub/.
  5. Обновляет и фиксирует новое содержимое в gitsub .
  6. Обновляет gitsuper .
    1. Добавьте или измените некоторый контент и установите его.
    2. (cd gitsub && git pull origin master)
    3. git add gitsub && git commit -m 'updated gitsuper content (also gitsub)'
  7. In hgsuper2, извлеките изменения из суперпозиториев Git.
    1. (cd gitsuper && git pull --recurse-submodules && git submodule update)
      Содержимое в gitsuper/ и gitsuper/gitsub/ обновляется при извлечении.
    2. hg commit -m 'updated gitsuper (and its contents)'
  8. Pullв hgsuper2-клон .
    1. hg pull -u
      Обновлен контент из Git.

Мои тесты работали (с использованием Mercurial 1.8.1 и Git 1.7.4.1), но я заметил одну ошибку.Mercurial создает и проверяет ветку Git со странным именем (origin/master (то есть refs/heads/origin/master) вместо использования отдельного HEAD (как Git делает со своими подмодулями) или просто с использованием master (то есть refs/heads/master)).Иногда кажется, что он немного заклинивает, что приводит к таким ошибкам:

fatal: git checkout: branch origin/master already exists
abort: git checkout error 128 in gitsuper

Я обошел проблему, зайдя в рассматриваемый репозиторий Git (подкаталог Mercurial на основе Git) и удаливветвь с git checkout HEAD~0 && git branch -D origin/master (первая отсоединяет HEAD и (что более важно) удаляется от ветки, поэтому ее можно удалить следующей командой).Этот обходной путь полностью безопасен, если у вас нет изменений локальных изменений в репозитории Git.

Другая небольшая проблема заключается в том, чтовам нужно будет запустить git submodule init, чтобы Git знал о своих подмодулях, прежде чем вводить команды подмодулей Git в супер-репозиторий Git, созданный Mercurial (подмодули были клонированы в нужных местах, но они были установлены Mercurial, поэтому есть нет записей для них в .git/config).

Точно так же, если вы планируете создавать изменения для содержимого, которым управляет Git, из подкаталога Mercurial на основе Git, то вы должны быть осторожны, чтобы всегда добавлять любые подмодули Git, фиксировать и выдвигать из подкаталогов Git перед фиксацией в ртутном «суперпроекте». В противном случае вы можете столкнуться с ситуацией, когда Mercurial использует одну комбинацию gitsuper и gitsub , тогда как gitsuper сама по себе ссылается на другую версию gitsub . Другими словами, так как вы будете обходить код подмодуля Git (управляя подмодулями Git как подкаталогами Mercurial), вам нужно быть осторожным, чтобы синхронизировать взгляд подмодулей с Git и Mercurial.

2 голосов
/ 13 декабря 2017

Для будущих скрытных.Вы можете использовать плагин Hg-Git для Mercurial для автоматического получения подмодулей git:

  1. Установите расширение через apt / pacman / pip / ... и активируйте его вyour ~/.hgrc
  2. Перейдите в каталог вашего проекта или просто в какое-нибудь фиктивное хранилище через hg init test && cd test
  3. Клонируйте вашу git-зависимость (которая также имеет свои собственные подмодули) и добавьте ее к коммиту, который вы хотите: hg clone https://github.com/user/libawesome.git && (cd libawesome && hg up release)
  4. Сохраните его в .hgsub как любой другой hg подкаталог и внесите изменения: echo "libawesome = https://github.com/user/libawesome.git" >> .hgsub && hg add .hgsub && hg ci -m "git subrepository added;"
  5. Теперь вы можете проверить, что git-зависимости транзитивно клонированы: (cd .. && hg clone test test2)
0 голосов
/ 03 апреля 2011

Git не очень "любит" подпроекты. Я немного огляделся, и кажется, что http://git.rsbx.net/Notes/Git_Subprojects.txt может содержать информацию, которую вы ищете?

...