Можно ли выполнить обновление подмодуля git для получения тегов в подмодулях? - PullRequest
17 голосов
/ 21 сентября 2011

У меня есть git-репозиторий, в котором используется подмодуль, на который я хотел бы указать аннотированный тег, но когда я делаю git submodule update, новые теги не извлекаются. Я могу получить новые теги в подмодуле, перейдя в подмодуль и выполнив там git fetch --tags, но я бы очень хотел сделать все это извне, так как он написан на скрипте.

Я не могу найти ничего в документации git, предлагающей способ заставить git submodule update включать теги (моя версия git 1.7.3.5).

Очевидно, что есть еще одна возможность - указать субмодуль на коммите, на который указывает тег, а не на сам тег, но это не выглядит аккуратно.

Есть ли способ получить git submodule update для включения тегов?

Ответы [ 4 ]

17 голосов
/ 05 сентября 2012

Поздний ответ здесь, но я удивлен, что никто не упомянул git submodule foreach. По сути, именно так я и решил ту проблему, с которой вы столкнулись:

git submodule foreach --recursive 'git fetch --tags'
git submodule update --recursive

--recursive есть флаг для включения в дочерние подмодули.

7 голосов
/ 22 сентября 2011

git submodule реализован в виде сценария оболочки, поэтому легко увидеть, что он делает - он может быть на /usr/lib/git-core/git-submodule, если вы используете упакованную версию. По сути, он просто запускает git-fetch в подмодуле, если имя объекта (SHA1sum), хранящееся в дереве основного проекта, не совпадает с версией, извлеченной в подмодуле, поскольку Koraktor указывает .

В документации для git fetch (или man git-fetch, когда kernel.org не работает) говорится, что он должен извлекать каждый тег, указывающий на загруженный объект, и загруженные объекты будут включать каждый коммит, который предок каждой ветви, которая выбрана. Это означает, что для меня удивительно, что вы не получаете все соответствующие теги на git submodule update.

Если вы действительно хотите, чтобы ваш сценарий пытался установить новую версию субмодуля и зафиксировать этот результат, я не думаю, что git submodule update - это инструмент, который вам нужен - это просто для создания убедитесь, что ваши подмодули имеют правильную версию, основанную на том, что в настоящее время находится в коммите основного проекта. Вместо этого вы должны просто сделать что-то вроде:

( cd my-submodule && \
      git fetch && \
      git fetch --tags && \
      git checkout my-tag )
git add my-submodule
git commit -m 'Update the submodule to the "my-tag" version' my-submodule

(я добавил дополнительные git fetch --tags на всякий случай ваш тег не тот, который указывает на загруженный коммит.)

Очевидно, что есть еще одна возможность - указать подмодуль на коммите, на который указывает тег, а не на сам тег, но это не выглядит аккуратно.

Ну, единственное, что хранится в дереве основного проекта для подмодуля, это просто хеш объекта коммита, поэтому даже если бы была команда, которая говорила «установить мой подмодуль на тег my-tag в этом подмодуле» в конечном итоге все равно будет храниться хеш, соответствующий этому тегу ...

4 голосов
/ 21 сентября 2011

git submodule update не получает ничего, если ваши подмодули обновлены. Так что это может быть ошибочным.

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

Лучшим способом было бы cd войти в ваш подмодуль (который сам является Git-репозиторием) и просто запустить git fetch --tags, а затем git checkout some-tag. После этого подмодуль был обновлен в вашем рабочем каталоге до some-tag, и вы можете установить его для фиксации.

0 голосов
/ 21 сентября 2011

вы можете написать его так, чтобы вы сделали (cd path-to-submod && git fetch)

Заключение команд в квадратные скобки переводит среду в подоболочку, то есть вам не нужно возвращать CD туда, где вы были.

Надеюсь, это поможет

...