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
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:
Najpierw utwórz nowy pusty repozytorium
$ mkdir repoclone $ cd repoclone/ $ git init Initialized empty Git repository in /home/user/repoclone/.git/
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.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
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'.
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)!
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
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?
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
- 1. Klon tylko jeden oddział
- 2. Git pobiera tylko jeden katalog
- 3. Pokaż tylko bieżący oddział w Git
- 4. Git mistrz oddział ma upstream oddział
- 5. git pobrać zdalny oddział i zdalny ref
- 6. git rebase jeden commit
- 7. Git: Ciągnięcie rebased oddział
- 8. Jak zamknąć oddział Git?
- 9. git: ruchome głowy oddział
- 10. jak zamknąć oddział w git
- 11. klon git-svn | fałszywe gałęzie
- 12. Git checkout inny oddział
- 13. Git oddział/nazwa tag^{}
- 14. Intellij - jak tylko rozgrupować lokalny oddział
- 15. Git dodać oddział w jednym katalogu?
- 16. Merge oddział z Git przepływu utrzymując oddział wciąż żyje
- 17. git: utwórz "tymczasowy" oddział integracji
- 18. Czy git może trwale zignorować oddział zdalny?
- 19. Git cofnąć lokalny oddział usunąć
- 20. git płytkie klon do określonego tagu
- 21. utworzyć oddział w Git z innego oddziału
- 22. Jak usunąć zdalny oddział w Git?
- 23. Czy można pobrać tylko jeden plik w Git?
- 24. Git - Połącz oddział z innego repozytorium
- 25. Klon GIT na dysk zewnętrzny do backupu
- 26. klon git, "sprawdzanie plików" faza pomijana
- 27. Jak utworzyć nowy oddział na poziomie lokalnym i zdalnym? GIT
- 28. Jak bezpiecznie usunąć zdalny oddział git?
- 29. Jak mogę "cofnąć" klon - pojedynczej gałęzi?
- 30. Git - zastąp lokalny oddział zdalnym oddziałem
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" –
BTW z nowoczesnym gitem możesz użyć 'git init repoclone' –
@Steve: Ach, masz rację . Możesz zastąpić "' git fetch origin master; git reset --hard FETCH_HEAD' ", aby ustawić master. – u0b34a0f6ae