Logo Questions Linux Laravel Mysql Ubuntu Git Menu

How to push tags with git subtree?

I have successfully created a big repo made of a few subrepos with git-subtree, let's say Master contains Slave1 and Slave2.

Master/ Slave1/ Slave2/

Now I want to tag on Master and push each tag to the slave repos, how can I do it?

If I "git push Slave2 --tags" the entire tag is transferred, but I only want the files related to Slave2 to be transferred.

You can achieve it with git-subsplit, but it's honestly a bit unpractical and slow.

Any suggestion?

like image 743
odino Avatar asked Mar 24 '23 00:03


2 Answers

As mentioned in "How to make “git push” include tags within a branch?", git 1.8.3 (May 2013) now includes a git push --follow-tags option:

Push all the refs that would be pushed without this option, and also push annotated tags in refs/tags that are missing from the remote but are pointing at commit-ish that are reachable from the refs being pushed.

Now, remember that a tag applies to the full repository (not a subdirectory), but one idea would be to:

  • merge master into a 'slave1_br' when you have a stable state of Slave1, and put a tag there.
  • merge master into a 'slave2_br' when you have a stable state of Slave2, and put a tag there.

And then:

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

That is the only way I know to not push all the tags, but only the one reachable from the branch you are pushing.
I realize that involves more than one branch (master), but it could be an alternative to git-subsplit.

like image 176
VonC Avatar answered Apr 02 '23 09:04


I have a solution using git subtree split

All is done on the Master Repository, you can use any branch of the Master.

First create the tag on Master repository

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

Create the tag for the Slave1

checkout the tag

git checkout 1.0.0

Create a branch containing only slave1 for this tag

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

Create the tag on this branch

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

Push the tag on the Slave1 repository

git push slave1 slave1_tag_1.0.0:1.0.0

Clean the Master repository

Clean the branch

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

Finally you will have on the Slave1 repository a tag at the same commit than the Master repository with the same name, here 1.0.0

The thing that IMHO is better is that there is no other branch appart from the temporary branch created for this (only the tag is pushed)

like image 31
Baptiste Mesta Avatar answered Apr 02 '23 09:04

Baptiste Mesta