Sklonować tylko stajnię i jeszcze jedną gałąź w git?

Dopiero zaczynam z Gitem i mam pytanie. Moja aplikacja ma 10 innych programistów pracujących nad nią, każdy z nich ma swoją własną gałąź jak dev_XXXXX. Więc jeśli zrobię klon repozytorium, czy cały ich kod zostanie skopiowany na moją maszynę? W takim razie nie chcę tego. Załóżmy, że moja gałąź to dev_swamy, jak sklonować tylko stabilną gałąź i dev_swamy? Dzięki.

Author: Swamy g, 2009-10-23

4 answers

Domyślnie git clone pobierze wszystkie gałęzie, ale te gałęzie będą przechowywane jako gałęzie zdalnego śledzenia: na przykład gałąź 'dev_xxxxxx' będzie przechowywana jako 'origin/dev_xxxxxx' (z 'refs/remotes/origin / dev_xxxxxx' jako pełna nazwa). Te gałęzie zdalnego śledzenia nie byłyby widoczne na wyjściu git branch: potrzebujesz git branch -r, aby wyświetlić listę gałęzi zdalnego śledzenia (lub git branch -a, aby wyświetlić listę wszystkich gałęzi). Jeśli te gałęzie nie odbiegają zbytnio od linii głównej, nie zajmowałyby zbyt dużo miejsca na dysku w repozytorium. Dlatego nie rozumiem, dlaczego chcesz klonować tylko wybrane gałęzie.

Niemniej jednak, jeśli chcesz mieć klon tylko z dwoma wybranymi gałęziami, możesz to zrobić w następujący sposób:

  1. Najpierw Utwórz nowe puste repozytorium

    $ mkdir repoclone
    $ cd repoclone/
    $ git init
    Initialized empty Git repository in /home/user/repoclone/.git/
    
  2. Następnie dodaj swoje repozytorium pod nazwą 'origin '(tak jak nazwałby je "git clone"), żądając śledzenia tylko dwóch gałęzi:' master 'i' dev_swamy', używając komendy "git remote". Sprawdź czy to został dodany poprawnie.

    $ git remote add -t master -t dev_swamy origin [email protected]:repo.git
    $ git remote 
    origin
    $ git remote show origin
    * remote origin
      Fetch URL: [email protected]:repo.git
      Push  URL: [email protected]: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)
    

    Jeśli gałąź stabilna nazywa się' stable', a nie 'master', to oczywiście należy zmodyfikować powyższy przykład. Istnieje również opcja -m <branch>, Jeśli chcesz, aby określona gałąź była domyślną gałąź w zdalnym.

  3. Pobieranie z 'origin' (możesz to zrobić również używając opcji -f do" git remote add " powyżej):

    $ 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 [email protected]:repo.git
     * [new branch]      master     -> origin/master
     * [new branch]      dev_swamy -> origin/dev_swamy
    From [email protected]:repo.git
     * [new tag]         v1.0       -> v1.0
     * [new tag]         v1.0.1    -> v1.0.1
     * [new tag]         v1.1       -> v1.1
    
  4. Skonfiguruj lokalną gałąź ' master '(gdzie wykonujesz swoją pracę), aby podążać za ' origin / master '(aby mieć 'origin / master' jako upstream), tak jak zrobiłby to "git clone":

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

    Możesz to powtórzyć dla gałęzi 'dev_swamy'.

  5. Teraz możesz zobaczyć jak wygląda plik konfiguracyjny. możesz uzyskać dokładnie ten sam wynik, edytując plik .git/config tak, aby wyglądał następująco, a następnie wykonując "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 = [email protected]: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
    

Nie zapomnij przedstawić się Gitowi przed rozpoczęciem pracy nad repozytorium (np. set 'user.name użytkownika 'i'.email ' zmienne konfiguracyjne; Zwykle w pliku konfiguracyjnym per-user)!

 23
Author: Jakub Narębski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-23 23:01:23

Jeśli sklonujesz, wszystkie wersje we wszystkich gałęziach są sklonowane, ale sklonowane repozytorium domyślnie będzie sprawdzać master.

Samo branie wybranych gałęzi jest trudniejsze, ponieważ git nie uważa, że powinieneś tak działać. Trzeba ręcznie ściągać gałęzie:

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

Powyżej jest to, co wiedziałem, że działa. Jeśli jednak chcesz skonfigurować Git repo, które działa normalnie, po prostu ma węższy widok swoich zdalnych gałęzi? Możesz to zrobić ładnie łatwo:

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
 4
Author: u0b34a0f6ae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-23 23:02:30

Innym sposobem na to jest uniknięcie bezpośredniego klonu, ale zamiast tego ręcznie dodaj pilota z niestandardowym zestawem refspeców pobierania.

Np.

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
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-23 22:26:39

Myślę, że ważniejszym pytaniem jest to, co inni będą naciskać, a nie co będziesz klonować lub ciągnąć. Ponieważ każdy programista pracuje nad własną gałęzią, innym pytaniem jest, jak skończyć z wspólną bazą kodu. Czy deweloperzy łączą swoje gałęzie, aby opanować? I czy oni następnie pchają ich zmienioną gałąź master do centralnego repozytorium? Jeśli tak jest, nie ma sposobu, aby wyciągnąć gałęzie innych deweloperów i tak.

Jeśli tak nie jest, zawiodłem aby zobaczyć, jak można utworzyć funkcjonujący zespół.

I tak jak myślałem: ciekaw jestem, dlaczego nie chcesz sklonować gałęzi innych deweloperów do swojego repozytorium?

 0
Author: innaM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-24 09:20:38