Мога ли да направя дълбоко копие на git хранилище с подмодули?

Лесно е да клонирате цял проект плюс всички негови подмодули:

git clone --recursive [email protected]:homer/powerplant.git

Как обаче да създам клонинг, който има всички тези подмодули, заменени от HEAD на самите отделни подхранилища? За предпочитане по такъв начин, че това да може да се повтори лесно, веднага щом нещо се промени. Целта трябва да бъде само за четене „плоска“ версия на същия общ код. Не трябва да е необходимо сливане.

Ако това е възможно, ще реши проблемите ми с Launchpad, където bzr може да импортира само хранилища без подмодули.


person Anne van Rossum    schedule 21.10.2013    source източник
comment
възможен дубликат на Необходимост от обработка на git-подмодули в git-archive   -  person CharlesB    schedule 22.10.2013
comment
Не се интересувам от архивиране. Просто искам дълбоко копие на git хранилище, където структурата на подмодула е изчезнала и е заменена от съответния код. По-скоро имам нужда от git flatten, ако съществува.   -  person Anne van Rossum    schedule 20.11.2013
comment
Да, Как да git clone --recursive и checkout master на всички подмодули в един ред? е по-добре   -  person CharlesB    schedule 20.11.2013
comment
Не, това също е нещо друго. Структурата на подмодула няма да изчезне, защото сте проверили и bzr пак няма да я разбере. Наистина искам изравнено копие, а не просто обикновен клонинг.   -  person Anne van Rossum    schedule 20.11.2013


Отговори (2)


Ако искате да започнете с файлове на подмодули, но не като git repos, просто направете следното:

  • клонирай рекурсивно git clone --recursive [email protected]:homer/powerplant.git (безумно име на репо между другото)
  • след това отменете регистрацията на подмодула с git config --remove-section submodule.name

В крайна сметка ще получите това, което искате, подмодулни файлове в работното дърво, но подмодули, които не са инициализирани като такива.

Можеше да използваш най-новата команда git submodule deinit, но тя също премахва файловете на подмодула от работното дърво.

person CharlesB    schedule 20.11.2013
comment
Трябва да проверя дали Launchpad приема това, но мисля, че това наистина е по линията, в която си го представях! - person Anne van Rossum; 20.11.2013
comment
Проблемът, който имате с Launchpad и git подмодулите, докладван ли е някъде? - person CharlesB; 20.11.2013

Не можете да го направите директно, тъй като подмодулите никога не се препращат от HEAD. Това е функция на Git, която предотвратява нежелано актуализиране на зависимости, така че подмодулите се препращат от суперпроекта при фиксиран SHA1, който може да бъде променен чрез ангажиране (в суперпроекта) на новите.

Обновяването на подмодулите до тяхната последна ревизия след клонирането обаче е просто: изпълнете следните команди в суперпроекта.

git submodule foreach git merge origin/master
git commit -am "updated all submodules to origin/master"

РЕДАКТИРАНЕ

Изглежда, че искате да проверите подмодулите след клонирането, командата е

git submodule update --init --recursive
person CharlesB    schedule 21.10.2013
comment
Благодаря, но проблемът не е, че не знам как да актуализирам хранилището с подмодули. Искам копие на това хранилище, където подмодулите са заменени от техния код. В противен случай bzr няма да може да го импортира. - person Anne van Rossum; 21.10.2013
comment
Разбрах, вижте този въпрос: Как да git clone --recursive и checkout master на всички подмодули в един ред? (аз включи правилния отговор в моя, не всички са верни) - person CharlesB; 21.10.2013
comment
Да, това е друг въпрос. Мисля, че единственото решение в моя случай, когато не искам да имам никакви подмодули в целевото хранилище, е чрез заобикаляне на git изцяло (и загуба на историята): rsync -avzul source-repos/ --exclude=.gitmodules --exclude=.git dest-repos/. Сега във финалното хранилище вече нямам подмодулите. Сравнете github.com/dobots/aim с github.com/dobots/aim-bzr. - person Anne van Rossum; 21.10.2013
comment
ДОБРЕ; така че искате дъмп на хранилището, без .git repo и включително подмодулите, нали? - person CharlesB; 21.10.2013
comment
comment
Хубава находка. Може наистина да е достатъчно да стартирате git-archive рекурсивно. В този случай обаче предпочитам да стартирам rsync сам (както по-горе), така че знам какво точно ще се случи. Това е едноредов, така че няма много проблеми. Просто си помислих, че може да има git опция, която съм пропуснал. - person Anne van Rossum; 22.10.2013
comment
Разбира се, rsync може да свърши работата тук. Не съм сигурен за предимствата на такъв скрипт, но трябва да има неща, с които е по-наясно. - person CharlesB; 22.10.2013