Клон просто стабильный и еще одна ветка в git? - PullRequest
16 голосов
/ 23 октября 2009

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

Ответы [ 4 ]

25 голосов
/ 24 октября 2009

По умолчанию 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 remote»."команда. Убедитесь, что он был добавлен правильно.

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

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

  3. Извлечение из 'origin' (вы также можете сделать это, используя опцию -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'; обычно в конфигурационном файле для каждого пользователя)!

4 голосов
/ 24 октября 2009

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

Просто брать выбранные ветки сложнее, так как 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
0 голосов
/ 24 октября 2009

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

, например

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
0 голосов
/ 24 октября 2009

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

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

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

...