Использование Mercurial для управления зависимостями в качестве вложенных репозиториев - PullRequest
0 голосов
/ 04 июня 2010

Я бы хотел иметь возможность управлять зависимостями моего приложения в Mercurial так, чтобы внутри моего приложения у меня был форк / клон репозитория зависимостей. Я хотел бы вносить и фиксировать изменения в хранилище зависимостей внутри приложения, но все же извлекать и объединять изменения из основного хранилища зависимостей. Нажатие на мое приложение должно подтолкнуть хранилище зависимостей вместе с ним, но файлы зависимостей не должны «отслеживаться» хранилищем приложения. Возможно ли это?

Структура каталогов:

-- app
   -- .hg
   -- dependency
      -- .hg

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

Когда я отправляю свой репозиторий приложений, не стоит пытаться выдвинуть репозиторий зависимостей.

Сессия ниже исследует проблему, пытаясь использовать подпункты. Сценарий эмулирует тот, где приложение и библиотека находятся в размещенном репозитории, таком как Google Code. Я также безуспешно пытался заставить Mercurial игнорировать субпозиторий.

# Make library on Google Code
mkdir libOnGCode
cd libOnGCode/
hg init
echo "this library is really complex" > libfile
hg add
hg ci -m "I'm so awesome..."
cd ..

# Make app on Google Code
mkdir appOnGCode
cd appOnGCode/
hg init
echo "my base app" > appfile
hg add
hg ci -m "Initial app commit"
cd ..

# Bring down local copy of app
hg clone appOnGCode appLocal
cd appLocal
hg clone ../libOnGCode/ lib
# abort: path 'lib/libfile' is inside repo 'lib'
echo "I'm gonna use a library" >> appfile
hg add lib
hg add lib/*
hg ci -m "Added a library"
hg push # It's not tracking lib

echo "Trying subrepos round 1..."
echo lib = lib > .hgsub
hg add .hgsub
hg ci -m "Adding subrepo"
# committing subrepository lib
hg push
# pushing to /workingdir/appOnGCode
# pushing subrepo lib
# abort: repository /workingdir/appOnGCode/lib not found!

echo "Trying subrepos round 2..."
echo lib = ../libOnGCode > .hgsub
hg ci -m "Adding subrepo"
hg push
# Cool, the subrepo worked, pulling app pulls lib
cd lib
echo "My addition to the lib" >> libfile
hg ci -m "Adding extra functionality"
cd ..
hg push
cd ../libOnGCode
hg update
echo "Argh, it updated the lib on google code"
echo "If I didn't have permission to push on the lib repo, pushing the app would fail"
cat libfile
echo "Removing those changes"
hg backout -m "Removing those changes" tip
cd ../appLocal/lib/
hg pull -u
echo "Trying to add extra functionality again" >> libfile
hg ci -m "Trying again"
cd .hg/
echo "Removing hgrc, which only has path info"
rm hgrc
cd ../../
hg push
cd ../appOnGCode
hg update
cat lib/libfile
# Tears hair out

PS. Если кто-то может исправить форматирование, я был бы благодарен.

Ответы [ 2 ]

1 голос
/ 06 июня 2010

Это лучшее решение, которое я нашел до сих пор: http://rklophaus.com/articles/20100124-SubmodulesAndSubreposDoneRight.html

Расти Клофаус написал этот небольшой скрипт, чтобы переименовать каталог .hg в .subhg, эффективно обманывая Mercurial, думая, что нет вложенного репозитория. Сценарий также передает команды hg реальному hg, устанавливая каталог для работы в качестве .subhg, так что почти все работает, если у вас есть его скрипт subhg. При желании вы можете добавить каталог .subhg в ваш .hgignore, чтобы не извлекать / выталкивать всю историю под-репозитория.

Недостатками этого является то, что участники должны иметь subhg для фиксации во вложенном репозитории. Я бы любил , чтобы увидеть такую ​​функциональность в Mercurial.

0 голосов
/ 05 июня 2010

Вместо локального клонирования репо libOnGCode, можете ли вы сначала клонировать его в репозиторий appOnGCode и добавить его в качестве субрепорации? Затем, когда вы клонируете репо appOnGCode, имеющаяся у вас копия libOnGCode будет иметь путь default, указывающий на репо appOnGCode/lib в Google Code. В основном, эта последовательность:

hg init libOnGCode
# Do stuff in libOnGCode
hg commit -m "Library is all set up"

hg init appOnGCode
# Do some stuff in appOnGCode
hg clone libOnGCode lib
echo lib = lib > .hgsub
hg add
hg commit -m "App is all set up"

# on your local system...
hg clone /path/to/appOnGCode app
cat app/lib/.hg/hgrc # Shows default is in appOnGCode/lib
# Do some stuff to app and/or lib
hg commit -m "Local stuff"
hg push  # Only goes to /appOnGCode.

Если вам также необходимо извлечь изменения из исходного репо libOnGCode, вы можете либо перетащить их в репо appOnGCode, либо прямо в локальное репо; в любом случае, все должно синхронизироваться.

...