ML
    • Recent
    • Categories
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Solved question about splitting git repos

    IT Discussion
    git branch repositories split
    2
    7
    942
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • JaredBuschJ
      JaredBusch
      last edited by JaredBusch

      I have no problem splitting a git repo into a new repo based on subfolder and the master branch.

      This command pretty much nails it.

      git filter-branch --prune-empty --subdirectory-filter YOURSUBFOLDER BRANCH
      # example:
      git filter-branch --prune-empty --subdirectory-filter PublicWebsite master
      

      But what if I have a subfolder and multiple branches other than master?

      The whole point is to get the subfolder out to a new repo and keep all the history.

      Can I do this?

      1 Reply Last reply Reply Quote 3
      • JaredBuschJ
        JaredBusch
        last edited by JaredBusch

        That did not work, but i found my way to the solution.

        1. Clone the original repository.
        git clone [email protected]:Your/Repo.git
        
        1. Check if there are any branches
        git branch -a
        

        Should look like this

        * master
          remotes/origin/Branch1
          remotes/origin/Branch2
          remotes/origin/HEAD -> origin/master
          remotes/origin/master
        
        1. Check out all branches that you want to save, and then switch back to master
        git checkout Branch1
        git checkout Branch2
        git checkout master
        
        1. Verify you have the ones you want
        git branch -a
        
        1. Should look like this
          Branch1
          Branch2
        * master
          remotes/origin/Branch1
          remotes/origin/Branch2
          remotes/origin/HEAD -> origin/master
          remotes/origin/master
        
        1. Remove the remote repository
        git remote rm origin
        
        1. Filter the subdirectory out that you want for all of the branches. Let's assume I have a subdirectory named Website.
        git filter-branch --prune-empty --force --subdirectory-filter Website Branch1
        git filter-branch --prune-empty --force --subdirectory-filter Website Branch2
        git filter-branch --prune-empty --force --subdirectory-filter Website master
        
        1. Add the new repository as the remote
        git remote add origin [email protected]:Your/NewRepo.git
        
        1. Push (with force) all branches up to the new repository
        git push -f --all
        
        1. You should see
        To gitlab.com:Your/NewRepo.git
         * [new branch]      Branch1 -> Branch1
         * [new branch]      Branch2 -> Branch2
         * [new branch]      master -> master
        
        1. Link the local branches to the origin/<branch>
        git branch --set-upstream-to=origin/Branch1 Branch1
        git branch --set-upstream-to=origin/Branch2 Branch2
        git branch --set-upstream-to=origin/master master
        
        1. You should see this for each branch.
        Branch 'master' set up to track remote branch 'master' from 'origin'.
        
        1 Reply Last reply Reply Quote 0
        • JaredBuschJ
          JaredBusch
          last edited by JaredBusch

          Basically each client is a repo project, and we want to now split all the folders out to their own discrete repo projects.

          Cause, is growth and shared use. when git was first implmented there was very little collaborative use of the repositories. That has changed and things need cleaned up

          Current repo folder structure

          Repos/
           - Client/ <--This is a repository
           - - Public Website/ <-- Folder in repository
           - - Intranet Portal/ <-- Folder in repository
           - - Intranet Secure/ <-- Folder in repository
           - Client 2/ <-- This is a repository
           - - etc/  <-- Folder in repository
          
          1 Reply Last reply Reply Quote 1
          • JaredBuschJ
            JaredBusch
            last edited by

            rewording my google criteria a few times, I got a hit that said to use --all instead of branchname

            I will be testing it out.

            RomoR 1 Reply Last reply Reply Quote 0
            • JaredBuschJ
              JaredBusch
              last edited by JaredBusch

              That did not work, but i found my way to the solution.

              1. Clone the original repository.
              git clone [email protected]:Your/Repo.git
              
              1. Check if there are any branches
              git branch -a
              

              Should look like this

              * master
                remotes/origin/Branch1
                remotes/origin/Branch2
                remotes/origin/HEAD -> origin/master
                remotes/origin/master
              
              1. Check out all branches that you want to save, and then switch back to master
              git checkout Branch1
              git checkout Branch2
              git checkout master
              
              1. Verify you have the ones you want
              git branch -a
              
              1. Should look like this
                Branch1
                Branch2
              * master
                remotes/origin/Branch1
                remotes/origin/Branch2
                remotes/origin/HEAD -> origin/master
                remotes/origin/master
              
              1. Remove the remote repository
              git remote rm origin
              
              1. Filter the subdirectory out that you want for all of the branches. Let's assume I have a subdirectory named Website.
              git filter-branch --prune-empty --force --subdirectory-filter Website Branch1
              git filter-branch --prune-empty --force --subdirectory-filter Website Branch2
              git filter-branch --prune-empty --force --subdirectory-filter Website master
              
              1. Add the new repository as the remote
              git remote add origin [email protected]:Your/NewRepo.git
              
              1. Push (with force) all branches up to the new repository
              git push -f --all
              
              1. You should see
              To gitlab.com:Your/NewRepo.git
               * [new branch]      Branch1 -> Branch1
               * [new branch]      Branch2 -> Branch2
               * [new branch]      master -> master
              
              1. Link the local branches to the origin/<branch>
              git branch --set-upstream-to=origin/Branch1 Branch1
              git branch --set-upstream-to=origin/Branch2 Branch2
              git branch --set-upstream-to=origin/master master
              
              1. You should see this for each branch.
              Branch 'master' set up to track remote branch 'master' from 'origin'.
              
              1 Reply Last reply Reply Quote 0
              • RomoR
                Romo @JaredBusch
                last edited by

                Maybe this helps?


                https://git-scm.com/docs/git-filter-branch

                To rewrite the repository to look as if foodir/ had been its project root, and discard all other history:

                git filter-branch --subdirectory-filter foodir -- --all

                Thus you can, e.g., turn a library subdirectory into a repository of its own. Note the -- that separates filter-branch options from revision options, and the --all to rewrite all branches and tags.

                JaredBuschJ 1 Reply Last reply Reply Quote 0
                • JaredBuschJ
                  JaredBusch @Romo
                  last edited by

                  This post is deleted!
                  1 Reply Last reply Reply Quote 0
                  • JaredBuschJ
                    JaredBusch
                    last edited by

                    Couple corrections to the solution posted above after more testing this evening.

                    1 Reply Last reply Reply Quote 1
                    • 1 / 1
                    • First post
                      Last post