Usuwanie brancha na originie korzystając z lokalnego repo.

0

Witam. Od kilku dni męczę się z pewnym problemem, który zupełnie przypadkiem natrafiłem podczas ćwiczenia na lokalnym repo rzeczy, która zupełnie nie była związana z zaistniałym problemem.

Wytłumaczę o co dokładnie chodzi. Na dysku lokalnym utworzyłem surowe repo.
git init --bare .
Utworzyłem również dwa foldery, które miały imitować "użytkowników" podpiętych do tego "zdalnego repo" z własnymi sklonowanymi repozytoriami. Foldery te to user1 oraz user2.

Utworzyłem pierwszym userem branch dev i dokonałem synchronizacji go ze zdalną gałęzią na originie git push -u origin dev. Pull na drugim użytkowniku działa i wszystko jest synchronizowane tak jak powinno być (normalne).

Teraz dochodzi taka oto sytuacja; tworzę userem1 nowy branch na devie o nazwie przypuśćmy ft-user1. Robię coś na nim, dodaję jakieś commity itp (symulacja, że coś się na tym branchu dzieje). Teraz by dokonać synchronizacji ze zdalnym repo robię ponownie: git push -u origin ft-user1. Przechodzę na usera2 robię pulla i faktycznie wykaz wszystkich branchy pokazuje, że powstał remotes/origin/ft-user1 (tutaj też bez niespodzianek). Przechodzę tym userem na ten branch i sprawdzam czy wszystko jest ok - jest ok. Dalej będąc na tym drugim użytkowniku chcę zrobić merge'a do deva. Robię więc

git checkout dev
git merge --no-ff ft-user1
git push

--no-ff tylko dlatego by rzucało się w oczy, że tam był osobny branch. Wysztko pięknie, fajnie. Na userze1 przechodzę na dev, robię pulla i wszystko jest takie jakie powinno być. Problem w tym, że chciałbym usunąć tą zdalną gałąź remotes/origin/ft-user1 userem2 wraz z jej lokalnym odpowiednikiem. W konsekwencji wykonuję
git branch -d -r origin/ft-user1
lub
git push origin :ft-user1
dla zdalnego brancha.
Odpowiednio dokonuję tego samego dla lokalnego brancha:
git branch -d ft-user1

Następnie robię git push --all

I tutaj jest właściwy problem. O ile po stronie z repo usera2 (tam gdzie robiłem merge'a i usuwałem branche) wykaz wszystkich branchy git branch -a nie wyświetla już lokalnego ft-user1 i co najważniejsze zdalnego remotes/origin/ft-user1, tak już tego nie mogę powiedzieć o userze1 (ten, na którym była tworzona gałąź ft-user1 i tam były dokonywane wszelkie commity na nim). Oczywiście robię git pull na userze1, lecz to nic nie daje. Czy tak powinno być? Czy user1 powinien mieć dalej dostęp do zdalnego remotes/origin/ft-user1? Czy problem tkwi w tym, że tak na prawdę nie robię tego na zdalnym repozytorium, tylko u siebie na dysku lokalnym? A może czegoś nie wiem, lub po prostu źle to robię?

Mam nadzieję, że w miarę opisowo wytłumaczyłem sytuację i że jest zrozumiałe to co chciałem osiągnąć. Jeżeli są jakieś wątpliwości, to proszę pytać, a postaram się wytłumaczyć. Z góry będę wdzięczny za wszelkie porady i odpowiedzi.

1

Tak, tak powinno być. By usunąć nieistniejące zdalne branche u użytkownika, który cały czas je ma trzeba użyć:

git fetch --prune

Aby usunąć robocze gałęzie nie ma polecenia, trzeba to zrobić albo ręcznie, albo jeśli te gałęzie są zmergowane to poleceniem:

git branch --merged master | grep -v '^\*' | grep -v master | xargs -n1 git branch -D
0

Dzięki @winerfresh za odpowiedź :]
Wczoraj wieczorem udało mi się uporać z tym problemem. Tak jak winerfresh napisał, rozwiązaniem jest użycie:
git fetch --prune
Można również użyć:
git remote prune origin
Oba robią w tym wypadku właściwie to samo.

Zakładałem, że sam pull powinien się uporać z odpowiednią aktualizacją śledzonych branchy, jednak to było błędne założenie.
Tutaj dodatkowe linki, które mogą się komuś przydać gdyby trafił na ten temat:
http://stackoverflow.com/questions/20106712/what-are-the-differences-between-git-remote-prune-git-prune-git-fetch-prune
http://stackoverflow.com/questions/3184555/cleaning-up-old-remote-git-branches

1

@dampe, rozwiązanie jest bardzo proste. Nie używać git pull (http://stackoverflow.com/questions/15316601/in-what-cases-could-git-pull-be-harmful).

Zamiast tego polecam git config --global alias.up '!git fetch --all --prune && git rebase --autostash FETCH_HEAD'

1 użytkowników online, w tym zalogowanych: 0, gości: 1