Clone just the stable and one other branch in git?

后端 未结 4 1509
粉色の甜心
粉色の甜心 2020-12-23 10:44

I\'m just getting started with git and I have a question. My app has 10 other developers working on it, each one having their own branch like dev_XXXXX. So if I do a clone o

4条回答
  •  攒了一身酷
    2020-12-23 11:27

    By default git clone would fetch all branches, but those branches would be stored as remote-tracking branches: for example branch 'dev_XXXXX' would be stored as 'origin/dev_XXXXX' (with 'refs/remotes/origin/dev_XXXXX' as full name). Those remote-tracking branches wouldn't be visible in git branch output: you would need git branch -r to list remote-tracking branches (or git branch -a to list all branches). If those branches do not diverge too much from mainline, they wouldn't take too much disk space in repository. Therefore I don't see why you want to clone only selected branches.

    Nevertheless if you want to have a clone with only two selected branches, you can do it like this:

    1. First, create new empty repository

      $ mkdir repoclone
      $ cd repoclone/
      $ git init
      Initialized empty Git repository in /home/user/repoclone/.git/
      
    2. Then add your repository under the name 'origin' (just like "git clone" would name it), requesting tracking of only two branches: 'master' and 'dev_swamy', using "git remote" command. Check that it was added correctly.

      $ git remote add -t master -t dev_swamy origin user@example.com:repo.git
      $ git remote 
      origin
      $ git remote show origin
      * remote origin
        Fetch URL: user@example.com:repo.git
        Push  URL: user@example.com:repo.git
        HEAD branch: master
        Remote branches:
          master          new (next fetch will store in remotes/origin)
          dev_swamy new (next fetch will store in remotes/origin)
      

      If the stable branch is called 'stable' rather than 'master', you would have of course to modify above example. Also there is -m option if you want specified branch to be default branch in remote.

    3. Fetch from 'origin' (you could do this also by using -f option to "git remote add" above):

      $ git fetch
      remote: Counting objects: 282, done.
      remote: Compressing objects: 100% (193/193), done.
      remote: Total 282 (delta 82), reused 0 (delta 0)
      Receiving objects: 100% (282/282), 81.30 KiB | 135 KiB/s, done.
      Resolving deltas: 100% (82/82), done.
      From user@example.com:repo.git
       * [new branch]      master     -> origin/master
       * [new branch]      dev_swamy -> origin/dev_swamy
      From user@example.com:repo.git
       * [new tag]         v1.0       -> v1.0
       * [new tag]         v1.0.1    -> v1.0.1
       * [new tag]         v1.1       -> v1.1
      
    4. Set up local branch 'master' (where you would do your work) to follow 'origin/master' (to have 'origin/master' as upstream), just like "git clone" would do:

      $ git checkout -t origin/master
      Branch master set up to track remote branch master from origin.
      Already on 'master'
      

      You can repeat this for branch 'dev_swamy'.

    5. Now you can see how config file looks like. You can get exactly the same result by editing .git/config file to look like the following, and then doing "git fetch".

      $ cat .git/config  # or just open this file in your editor
      [core]
              repositoryformatversion = 0
              filemode = true
              bare = false
              logallrefupdates = true
      [remote "origin"]
              url = user@example.com:repo.git
              fetch = +refs/heads/master:refs/remotes/origin/master
              fetch = +refs/heads/dev_swamy:refs/remotes/origin/dev_swamy
      [branch "master"]
              remote = origin
              merge = refs/heads/master
      

    Don't forget to introduce yourself to Git before starting work on repository (i.e. set 'user.name' and 'user.email' config variables; usually in per-user config file)!

提交回复
热议问题