2009-10-23 9 views
14

Po prostu zaczynam od git i mam pytanie. Moja aplikacja ma 10 innych programistów pracujących nad nią, z których każdy ma własną gałąź, taką jak dev_XXXXX. Więc jeśli zrobię klon repozytorium, czy cały jego kod zostanie skopiowany do mojego komputera? W takim przypadku nie chcę tego. Załóżmy, że moją gałęzią jest dev_swamy, w jaki sposób mogę sklonować tylko stabilną gałąź i dev_swamy? Dzięki.Klon tylko stabilny i jeden oddział w git?

Odpowiedz

23

Domyślnie git clone będzie pobierał wszystkie branże, ale oddziały te zostaną zapisane w formie oddziałów zdalnych śledzenia: na przykład oddział „dev_XXXXX” byłyby przechowywane jako „pochodzenia/dev_XXXXX” (z „bibl/pilotów/pochodzenia/dev_XXXXX "jako pełną nazwę). Te odległe odgałęzienia śledzenia nie byłyby widoczne w wynikach: musisz mieć git branch -r, aby wyświetlić listę oddziałów śledzenia zdalnego (lub git branch -a, aby wyświetlić wszystkie gałęzie). Jeśli te gałęzie nie odbiegają zbytnio od głównej linii, nie zajmą zbyt wiele miejsca na dysku w repozytorium. Dlatego nie widzę powodu, dla którego chcesz sklonować tylko wybrane gałęzie.

Niemniej jednak, jeśli chcesz mieć klon z zaledwie dwóch wybranych oddziałach, można zrobić to tak:

  1. Najpierw utwórz nowy pusty repozytorium

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

    $ 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 jest nazywana "stabilną" zamiast "wzorcową", należałoby oczywiście zmodyfikować powyższy przykład. Dostępna jest również opcja -m <branch>, jeśli chcesz, aby określona gałąź była domyślną gałęzią w zdalnym.

  3. Fetch z 'pochodzenia' (można to zrobić również za pomocą -f opcję "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 lokalny oddział 'mistrz' (gdzie byś zrobił swoje praca), aby śledzić 'pochodzenie/master' (aby mieć 'pochodzenie/master' jak powyżej), podobnie jak "clone git" byłoby zrobić:

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

    można powtórzyć to dla branży 'dev_swamy'.

  5. Teraz możesz zobaczyć, jak wygląda plik konfiguracyjny. Możesz uzyskać dokładnie taki sam wynik, edytując plik .git/config, aby wyglądał jak poniżej, 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 zapomnijcie się przedstawić do git przed rozpoczęciem prac nad repozytorium (czyli zestaw „user.name” i „user.email zmiennych konfiguracyjnych”; zwykle w pliku konfiguracyjnym dla każdego użytkownika)!

4

Jeśli klonujesz, wszystkie wersje we wszystkich gałęziach są klonowane wzdłuż, ale sklonowane repozytorium domyślnie sprawdzi domyślny wzorzec.

Samo branie wybranych gałęzi jest trudniejsze, ponieważ git tak naprawdę nie myśli, że powinieneś pracować w ten sposób. Trzeba ciągnąć w dół gałęzie ręcznie:

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 

Ponad to, co wiedziałem pracował. Jeśli jednak chcesz ustawić repozytorium git działające normalnie, po prostu ma on węższy widok swoich odległych oddziałów? Można to zrobić bardzo ł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 
+0

Aha! To jest coś, o czym myślałem od jakiegoś czasu - czy istnieje sposób klonowania tylko jednej gałęzi. Ciekawy pomysł, aby włączyć go na głowę i pobrać tylko to, czego potrzebujesz. Ale pierwsze pobranie generuje ten błąd: "fatal: Odmowa pobrania do bieżącego branch refs/heads/master repozytorium non-bare" –

+0

BTW z nowoczesnym gitem możesz użyć 'git init repoclone' –

+0

@Steve: Ach, masz rację . Możesz zastąpić "' git fetch origin master; git reset --hard FETCH_HEAD' ", aby ustawić master. – u0b34a0f6ae

0

myślę, że ważniejsze pytanie o to, co inni będą popychanie, a nie co będzie klonowanie lub ciągnięcie. Ponieważ każdy programista pracuje w swoim oddziale, kolejnym pytaniem jest, w jaki sposób uzyskujesz wspólną podstawę kodu. Czy programiści łączą swoje oddziały w celu opanowania? Czy następnie przesuwają zmienioną gałąź główną do centralnego repozytorium? Jeśli tak jest, nie ma możliwości, abyś i tak wyciągnął gałęzie innych deweloperów.

Jeśli tak nie jest, nie widzę sposobu, w jaki można utworzyć działający zespół.

I jak ostatecznie myślałem: Byłbym ciekawy, dlaczego nie chcesz sklonować oddziałów innych programistów do twojego repozytorium?

0

Innym sposobem, aby to zrobić, jest uniknięcie bezpośredniego klonu, ale zamiast tego należy ręcznie dodać pilota przy użyciu niestandardowego zestawu elementów do pobrania.

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