Как сделать мелкие подмодули мерзавца?

Действительно ли возможно иметь мелкие подмодули? У меня есть суперпроект с несколькими подмодулями, каждый с долгой историей, таким образом, это получает излишне большое перетаскивание всей той истории.

Все, что я нашел, является этим оставшимся без ответа потоком.

Я должен просто взломать подмодуль мерзавца для реализации этого?

129
задан Ciro Santilli 新疆改造中心法轮功六四事件 19 May 2018 в 08:12
поделиться

3 ответа

Следует следующее Ответ Райана Я смог придумать этот простой сценарий, который итерации через все подмодулы и мелкие клоны их:

#!/bin/bash
git submodule init
for i in $(git submodule | sed -e 's/.* //'); do
    spath=$(git config -f .gitmodules --get submodule.$i.path)
    surl=$(git config -f .gitmodules --get submodule.$i.url)
    git clone --depth 1 $surl $spath
done
git submodule update
15
ответ дан 24 November 2019 в 00:33
поделиться

Являются ли канонические местоположения для ваших подмодулей удаленными? Если да, то вы в порядке с клонированием их один раз? Другими словами, хотите ли вы неглубокие клоны только потому, что вы страдаете от пустой полосы пропускания частых субмодульных клонов?

Если вы хотите неглубокие клоны, чтобы спасти локальное дисковое пространство, то ответ Райана Грэма кажется хорошим способом. Клонируйте хранилища вручную, чтобы они были неглубокими. Если вы считаете это полезным, адаптируйте субмодуль git для его поддержки. Отправьте электронное письмо по адресу из списка с запросом о нем (рекомендации по его реализации, предложения по интерфейсу и т.д.). На мой взгляд, люди там вполне поддерживают потенциальных вкладчиков, которые искренне хотят улучшить Git конструктивным образом.

Если вы в порядке с выполнением одного полного клона каждого подмодуля (плюс более поздние выборки, чтобы поддерживать их в актуальном состоянии), вы можете попробовать использовать опцию --привязка в git submodule update (находится в Git 1.6.4 и более поздних версиях) для обозначения локальных хранилищ объектов (например, создайте клоны -mirror в хранилищах канонических подмодулей, затем используйте -привязку в подмодулях, чтобы указать на эти локальные клоны). Перед использованием -привязки просто прочитайте о git clone --привязке / git clone --объединенной . Единственная вероятная проблема со ссылками на зеркала будет заключаться в том, что они когда-либо получат обновления без быстрой пересылки (хотя вы можете включить рефлоги и расширить их окна истечения срока действия, чтобы помочь сохранить любые заброшенные фиксаторы, которые могут вызвать проблему). У вас не должно быть проблем до тех пор, пока

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

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

И, как говорится в git clone manpage, не используйте -привязку , если вы не понимаете этих последствий.

# Full clone (mirror), done once.
git clone --mirror $sub1_url $path_to_mirrors/$sub1_name.git
git clone --mirror $sub2_url $path_to_mirrors/$sub2_name.git

# Reference the full clones any time you initialize a submodule
git clone $super_url super
cd super
git submodule update --init --reference $path_to_mirrors/$sub1_name.git $sub1_path_in_super
git submodule update --init --reference $path_to_mirrors/$sub2_name.git $sub2_path_in_super

# To avoid extra packs in each of the superprojects' submodules,
#   update the mirror clones before any pull/merge in super-projects.
for p in $path_to_mirrors/*.git; do GIT_DIR="$p" git fetch; done

cd super
git pull             # merges in new versions of submodules
git submodule update # update sub refs, checkout new versions,
                     #   but no download since they reference the updated mirrors

В качестве альтернативы вместо -привязки можно использовать зеркальные клоны в сочетании со стандартной функцией жесткого связывания git clone , используя локальные зеркала в качестве источника для подмодулей. В новых клонах суперпроектов выполните команду git submodule init , измените URL-адреса подмодулей в .git/config , чтобы указать на локальные зеркала, затем выполните git submodule update . Для получения жестких ссылок необходимо повторно объединить все существующие извлеченные подмодули. Вы сэкономите пропускную способность, загрузив только один раз в зеркала, а затем извлекая локально из них в извлеченные подмодули. Жесткая привязка позволила бы сэкономить место на диске (хотя выборки, как правило, накапливались и дублировались в нескольких экземплярах хранилищ объектов выданных подмодулей; можно периодически повторять извлеченные подмодули из зеркал, чтобы восстановить экономию дискового пространства, обеспечиваемую аппаратной привязкой).

3
ответ дан 24 November 2019 в 00:33
поделиться

Чтение через git-submodule "source",похоже, что git submodule add может обрабатывать подмодули, у которых уже есть свои репозитории. В этом случае ...

$ git clone $remote1 $repo
$ cd $repo
$ git clone --depth 5 $remotesub1 $sub1
$ git submodule add $remotesub1 $sub1
#repeat as necessary...

Вы захотите убедиться, что требуемая фиксация находится в репозитории подмодуля, поэтому убедитесь, что вы установили соответствующую --depth.

Редактировать: Вы можете обойтись без нескольких ручных клонов субмодулей с последующим одним обновлением:

$ git clone $remote1 $repo
$ cd $repo
$ git clone --depth 5 $remotesub1 $sub1
#repeat as necessary...
$ git submodule update
8
ответ дан 24 November 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: