Moja sytuacja jest taka ... ktoś pracujący nad tym samym repozytorium usunął oddział z repozytorium lokalnego i zdalnego ...
Większość osób, które pytały o tego rodzaju problem w przypadku przepełnienia stosu lub innych witryn, nadal ma problem z odgałęzieniami git branch -a
na liście rozgałęzień zdalnego śledzenia na dole:
* master
develop
feature_blah
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
remotes/origin/random_branch_I_want_deleted
Jednak w MOJEJ sytuacji gałąź, która nie powinna tam być, jest lokalna:
* master
develop
feature_blah
random_branch_I_want_deleted
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
Gdy wykonam jedną z poniższych czynności, nie zostanie ona usunięta lokalnie:
$ git prune
Próbowałem także:
$ git remote prune origin
$ git fetch --prune
Więcej przydatnych informacji: Kiedy sprawdzam, git remote show origin
tak to wygląda:
* remote origin
Fetch URL: utilities:homeconnections_ui.git
Push URL: utilities:homeconnections_ui.git
HEAD branch: master
Remote branches:
master tracked
develop tracked
feature_blah tracked
other123 tracked
other444 tracked
other999 tracked
Local branches configured for 'git pull':
develop merges with remote develop
feature_blah merges with remote other999
master merges with remote master
random_branch_I_want_deleted merges with remote random_branch_I_want_deleted
Local refs configured for 'git push':
develop pushes to develop (local out of date)
master pushes to master (up to date)
feature_blah pushes to feature_blah(up to date)
Zauważ, że jest to tylko sekcja zatytułowana Local branches configured for 'git pull':
Dlaczego?
git
remote-branch
gogogadgetinternet
źródło
źródło
git branch -d the_local_branch
x/y
): została ona naprawiona (patrz moja odpowiedź poniżej )Odpowiedzi:
Nie obwiniam cię za frustrację z tego powodu. Najlepszym sposobem na to jest spojrzenie. Istnieją potencjalnie trzy wersje każdej zdalnej gałęzi:
(np. Zdalne repo na https://example.com/repo.git ,
refs/heads/master
)refs/remotes/...
)(np. Lokalne repozytorium
refs/remotes/origin/master
)(np. Lokalne repozytorium
refs/heads/master
)Zacznijmy od
git prune
. Usuwa to obiekty , do których już nie ma odniesień, nie usuwa też odniesień. W twoim przypadku masz oddział lokalny. Oznacza to, że istnieje nazwarandom_branch_I_want_deleted
o nazwie odnosząca się do niektórych obiektów reprezentujących historię tej gałęzi. Zatem z definicjigit prune
nie zostanie usuniętyrandom_branch_I_want_deleted
. Naprawdę,git prune
to sposób na usunięcie danych, które zgromadziły się w Git, ale do których nic nie ma odniesienia. Zasadniczo nie wpływa to na widok żadnych gałęzi.git remote prune origin
igit fetch --prune
oba działają w oparciu o referencje w obszarzerefs/remotes/...
(będę się nazywać tymi referencjami zdalnymi). Nie wpływa na lokalne oddziały. Tagit remote
wersja jest przydatna, jeśli chcesz usunąć odwołania zdalne tylko pod określonym pilotem. W przeciwnym razie obaj robią dokładnie to samo. Tak, w skrócie,git remote prune
igit fetch --prune
działają na numer 2 powyżej. Na przykład, jeśli usunąłeś gałąź za pomocą GUI web git i nie chcesz, aby pojawiała się na liście lokalnych gałęzi (git branch -r
), to jest to polecenie, którego powinieneś użyć.Aby usunąć oddział lokalny, powinieneś użyć
git branch -d
(lub-D
jeśli nie jest on nigdzie scalony). FWIW, nie ma polecenia git, aby automatycznie usunąć lokalne gałęzie śledzenia, jeśli gałąź zdalna zniknie.źródło
xargs git branch -D
, ale zauważ, że wszystkie utworzone ale nigdy zepchnięte na serwerze nowych oddziałów będzie usunięty, więc bieżnika ostrożnie:git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}'
packed-refs
plik w tym.git
obszarze), więc niekoniecznie jest to prosta kwestia usunięcia ich za pomocą eksploratora plików. Lepiej używać poleceń, aby upewnić się, że oba są obsługiwane poprawnie.git remote prune
igit fetch --prune
zrób to samo: usuń odnośniki do gałęzi, które nie istnieją na pilocie, jak powiedziałeś. Drugie polecenie łączy się z pilotem i pobiera jego bieżące gałęzie przed przycinaniem.Nie dotyka jednak lokalnych oddziałów, które sprawdziłeś, a które możesz po prostu usunąć
Zastąp
-d
,-D
jeśli gałąź nie jest scalona w innym miejscugit prune
robi coś innego, czyści nieosiągalne obiekty, te commity, które nie są osiągalne w żadnej gałęzi ani tagu, a zatem nie są już potrzebne.źródło
git prune
szuka nie tylko gałęzi i tagów, ale także wszystkich innych referencji.git remote prune
)W przypadku, gdyby każdy był zainteresowany. Oto szybki skrypt powłoki, który usunie wszystkie lokalne gałęzie, które nie są śledzone zdalnie. Słowo ostrzeżenia: pozbywa się każdego oddziału, który nie jest śledzony zdalnie, niezależnie od tego, czy został scalony, czy nie.
Jeśli zauważysz jakieś problemy, daj mi znać, a ja to naprawię (itp.)
Zapisz go w pliku o nazwie
git-rm-ntb
(nazywaj go cokolwiek)PATH
i uruchom:git-rm-ntb <remote1:optional> <remote2:optional> ...
źródło
Zauważ, że jedna różnica między
git remote --prune
igit fetch --prune
jest naprawiana, z zatwierdzeniem 10a6cc8 , przez Tom Miller (tmiller
) (dla git 1.9 / 2.0, Q1 2014):Tak więc: gdy repozytorium nadrzędne ma gałąź („frotz”) o tej samej nazwie co hierarchia gałęzi („frotz / xxx”, możliwa konwencja nazewnictwa gałęzi ), powiodło się
git remote --prune
(w oczyszczeniu gałęzi zdalnego śledzenia z repozytorium) , alegit fetch --prune
zawiodło.Nigdy więcej:
źródło