Как нажимать теги с поддеревом git?

Я успешно создал большой репозиторий, состоящий из нескольких подрепозиториев с git-subtree, скажем, Master содержит Slave1 и Slave2.

Ведущий/ Ведомый1/ Ведомый2/

Теперь я хочу пометить Master и отправить каждый тег в подчиненные репозитории, как мне это сделать?

Если я «git push Slave2 --tags», весь тег будет передан, но я хочу, чтобы были переданы только файлы, связанные с Slave2.

Вы можете добиться этого с помощью git-subsplit, но, честно говоря, это немного непрактично и медленно.

Любое предложение?


person odino    schedule 28.07.2013    source источник


Ответы (3)


Как упоминалось в разделе «Как заставить «git push» включать теги в ветку?», git 1.8.3 (май 2013 г. ) теперь включает параметр git push --follow-tags:

Отправьте все ссылки, которые были бы отправлены без этой опции, а также отправьте аннотированные теги в refs/tags, которые отсутствуют на удаленном компьютере, но указывают на фиксацию, достижимую из отправляемых ссылок.

Теперь помните, что тег применяется ко всему репозиторию (а не к подкаталогу), но одна из идей заключается в следующем:

  • объедините master в 'slave1_br', когда у вас будет стабильное состояние Slave1, и поместите туда тег.
  • объедините master в 'slave2_br', когда у вас будет стабильное состояние Slave2, и поместите туда тег.

А потом:

git push --follow_tags slave1 slave1_br
git push --follow_tags slave2 slave2_br

Это единственный известный мне способ не отправлять все теги, а только тот, который доступен из ветки, которую вы отправляете.
Я понимаю, что это включает в себя более одного ветвь (master), но она может быть альтернативой git-subsplit.

person VonC    schedule 05.08.2013
comment
Спасибо! Все еще слишком сложное по сравнению с моим идеальным решением, но дает мне представление о том, как поддержка подразбиения все еще далека от совершенства :) - person odino; 07.08.2013

У меня есть решение, использующее разделение поддерева git

Все делается в Master Repository, вы можете использовать любую ветку Master.

Сначала создайте тег в главном репозитории.

git tag -a 1.0.0 -m "the tag 1.0.0"

Создайте тег для Slave1

проверить тег

git checkout 1.0.0

Создайте ветку, содержащую только slave1 для этого тега

git subtree split --prefix=Slave1 -b slave1_br_1.0.0

Создайте тег на этой ветке

git checkout slave1_br_1.0.0
git tag -a slave1_tag_1.0.0 -m "the tag 1.0.0"

Вставьте тег в репозиторий Slave1

git push slave1 slave1_tag_1.0.0:1.0.0

Очистите главный репозиторий

Очистите ветку

git checkout master
git branch -D slave1_br_1.0.0
git tag -d slave1_tag_1.0.0
git gc --prune=now

Наконец, у вас будет тег в репозитории Slave1 с той же фиксацией, что и в репозитории Master с тем же именем, здесь 1.0.0.

То, что ИМХО лучше, это то, что нет другой ветки, кроме временной ветки, созданной для этого (только тег проталкивается)

person Baptiste Mesta    schedule 19.11.2015

Я нашел это с трудом.

При использовании поддерева фиксация в репозитории поддерева будет иметь другой SHA.

Таким образом, вам нужно только отправить коммиты в поддерево, затем найти конкретный коммит в репозитории поддерева, который вы хотите пометить, пометить его и отправить в репозиторий поддерева.

Моя настройка использует sourcetree и github.com, но я думаю, что в других случаях должно быть то же самое.

  1. У меня есть основное репо, которое синхронизируется с битбакетом, и подпапка, настроенная как поддерево, синхронизируется с репозиторием github.
  2. Я использую это пользовательское действие в исходном дереве, чтобы нажать поддерево

скрипт для запуска: git

Параметры: shiny/app — моя подпапка, webapp — удаленное имя моего репозитория github.

subtree push -P shiny/app webapp master --squash
  1. Найдите конкретный коммит в ветке поддерева, пометьте его и отправьте тег в репозиторий поддерева.

Это намного проще и чище, чем все ответы выше. Конечно, тег ограничен поддеревом, а не полным репо, но я думаю, что это то, что я хочу.

person dracodoc    schedule 24.08.2017
comment
Интересная альтернатива моему ответу. +1 - person VonC; 25.08.2017