Клонировать только стабильную и еще одну ветку в git?

StackOverflow https://stackoverflow.com/questions/1615488

  •  06-07-2019
  •  | 
  •  

Вопрос

Я только начинаю работать с git, и у меня есть вопрос.Над моим приложением работают 10 других разработчиков, у каждого из которых есть своя ветка, например dev_XXXXX.Итак, если я создам клон репозитория, будет ли весь их код скопирован на мой компьютер?В таком случае я этого не хочу.Предположим, моя ветка dev_swamy, как мне тогда клонировать только стабильную ветку и dev_swamy?Спасибо.

Это было полезно?

Решение

По умолчанию git clone извлек бы все ветви, но эти ветви были бы сохранены как ветви удаленного отслеживания:например, ветка 'dev_XXXXX' будет сохранена как 'origin/dev_XXXXX' (с 'refs / remotes/origin/dev_XXXXX' в качестве полного имени).Эти ветви удаленного отслеживания не были бы видны в git branch выходной сигнал:вам понадобилось бы git branch -r чтобы перечислить филиалы удаленного отслеживания (или git branch -a перечислить все филиалы).Если эти ветви не слишком сильно расходятся с основной линией, они не будут занимать слишком много места на диске в репозитории.Поэтому я не понимаю, почему вы хотите клонировать только выбранные ветви.

Тем не менее, если вы хотите иметь клон только с двумя выбранными ветвями, вы можете сделать это следующим образом:

  1. Сначала создайте новый пустой репозиторий

    $ mkdir repoclone
    $ cd repoclone/
    $ git init
    Initialized empty Git repository in /home/user/repoclone/.git/
    
  2. Затем добавьте свой репозиторий под именем "origin" (точно так же, как его назвал бы "git clone"), запрашивая отслеживание только двух ветвей:"master" и "dev_swamy", используя "git удаленный- командуй.Убедитесь, что он был добавлен правильно.

    $ 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)
    

    Если стабильная ветвь называется "stable", а не "master", вам, конечно, придется изменить приведенный выше пример.Также есть -m <branch> опция, если вы хотите, чтобы указанная ветвь была веткой по умолчанию в удаленном режиме.

  3. Извлекать из "источника" (вы могли бы сделать это также с помощью -f опция "git remote add" выше):

    $ 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. Настройте локальную ветку 'master' (где вы будете выполнять свою работу), чтобы следовать 'origin / master' (чтобы иметь 'origin / master' в качестве восходящего потока), точно так же, как это сделал бы "git clone":

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

    Вы можете повторить это для ветки 'dev_swamy'.

  5. Теперь вы можете видеть, как выглядит конфигурационный файл. Вы можете получить точно такой же результат, отредактировав .git/config файл должен выглядеть следующим образом, а затем выполняется "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
    

Не забудьте познакомиться с Git перед началом работы над репозиторием (т.е.установите конфигурационные переменные 'user.name' и 'user.email';обычно в конфигурационном файле для каждого пользователя)!

Другие советы

При клонировании все ревизии во всех ветвях клонируются вместе, но клонированный репозиторий по умолчанию проверяет master .

Просто взять выбранные ветви сложнее, поскольку git на самом деле не думает, что вы должны работать таким образом.Вы должны опустить ветви вручную:

mkdir repoclone
cd repoclone
git init
git remote add origin git://remote/url
git fetch origin master:master
git fetch origin dev_XXX:dev_XXX

Выше приведено то, что, как я знал, сработало.Однако, если вы хотите настроить репозиторий git, который работает как обычно, просто имеет более узкое представление о его удаленных ветвях?Вы можете сделать это довольно легко:

mkdir repoclone
cd repoclone
git init
git remote add origin git://remote/url

# now open .git/config for editing in your editor
# replace the following line (grab all remote branches)
fetch = +refs/heads/*:refs/remotes/origin/*

# replace with lines listing exactly which branches you want
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/dev_XXX:refs/remotes/origin/dev_XXX

# save the file, now run

git fetch

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

например ,

mkdir myclone
cd myclone
git init

git remote add origin url://origin.repo

# Add fetch rules for the branches that we want to track
git config remote.origin.fetch +refs/heads/master:+refs/remotes/origin/master
git config --add remote.origin.fetch +refs/heads/dev_swamy:+refs/remotes/origin/dev_swamy

# fetch now fetches just what we need, subsequently it will do incremental fetches
git fetch

# Creating local branches tracking the remote branches
git checkout -b master origin/master
git branch dev_swamy origin/dev/swamy

Я думаю, что более важный вопрос здесь заключается в том, что будут подталкивать другие, а не в том, что вы будете клонировать или вытягивать.Поскольку каждый разработчик работает над своей собственной веткой, другой вопрос заключается в том, как в итоге вы получаете общую базу кода.Объединяют ли разработчики свои ветви для освоения?И затем они отправляют свою измененную главную ветвь в центральный репозиторий?Если это так, то у вас все равно нет возможности использовать ветки других разработчиков.

Если это не так, я не понимаю, как вы можете сформировать функционирующую команду.

И как я в последний раз подумал:Мне было бы любопытно узнать, почему вы не хотите клонировать ветки других разработчиков в свой репозиторий?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top