Używamy tagów w git jako część naszego procesu wdrażania. Od czasu do czasu chcemy wyczyścić te tagi, usuwając je z naszego zdalnego repozytorium.
To jest całkiem proste. Jeden użytkownik usuwa tag lokalny i tag zdalny w jednym zestawie poleceń. Mamy mały skrypt powłoki, który łączy oba kroki.
Drugi (trzeci, czwarty, ...) użytkownik ma teraz tagi lokalne, które nie są już widoczne na pilocie.
Szukam polecenia podobnego do tego, git remote prune origin
które usuwa lokalnie śledzące gałęzie, dla których gałąź zdalna została usunięta.
Alternatywnie, można użyć prostej komendy do wyświetlenia zdalnych tagów w celu porównania z lokalnymi tagami zwróconymi przez git tag -l
.
git config fetch.pruneTags true
sprawią, że będzieszgit fetch
robić, co chcesz! Zobacz moją odpowiedź na to drugie pytanie .Odpowiedzi:
Dobre pytanie. :) Nie mam pełnej odpowiedzi ...
To powiedziawszy, możesz uzyskać listę zdalnych tagów za pośrednictwem
git ls-remote
. Aby wyświetlić listę tagów w repozytorium, do którego się odwołujeszorigin
, uruchom:Zwraca listę skrótów i przyjaznych nazw znaczników, takich jak:
Z pewnością możesz stworzyć skrypt bash, aby porównać tagi generowane przez tę listę z tagami, które masz lokalnie. Spójrz na
git show-ref --tags
, która generuje nazwy znaczników w takiej samej formie jakgit ls-remote
).Nawiasem mówiąc,
git show-ref
ma opcję, która robi coś przeciwnego do tego, co chcesz. Następujące polecenie wyświetli wszystkie tagi w zdalnej gałęzi, których nie masz lokalnie:źródło
git remote | xargs -L 1 git ls-remote --tags | git show-ref --tags --exclude-existing
To świetne pytanie, zastanawiałem się nad tym samym.
Nie chciałem pisać skryptu, więc szukałem innego rozwiązania. Kluczem jest odkrycie, że możesz usunąć tag lokalnie, a następnie użyć git fetch, aby „odzyskać” ze zdalnego serwera. Jeśli tag nie istnieje na pilocie, pozostanie usunięty.
Dlatego musisz wpisać dwie linie w kolejności:
Te:
Usuń wszystkie tagi z lokalnego repozytorium. FWIW, xargs umieszcza dane wyjściowe każdego znacznika przez „tag -l” w wierszu poleceń dla „tag -d”. Bez tego git niczego nie usunie, ponieważ nie czyta stdin (głupie git).
Pobierz wszystkie aktywne tagi ze zdalnego repozytorium.
Działa to nawet w systemie Windows.
źródło
git tag prune origin
polecenie.git tag -l | %{git tag -d $_}
aby to działało w PowerShell. Nie jestem pewien nikogo innego.Z Git v1.7.8 do v1.8.5.6 możesz użyć tego:
Aktualizacja
Nie działa to na nowszych wersjach git (począwszy od wersji 1.9.0 ) z powodu zatwierdzenia e66ef7ae6f31f2 . Jednak tak naprawdę nie chcę tego usuwać, ponieważ działało to u niektórych osób.
Jak sugeruje „Chad Juliano”, we wszystkich wersjach Gita od wersji 1.7.8 można użyć następującego polecenia:
Konieczne może być dołączenie części tagów do cudzysłowów (na przykład w systemie Windows), aby uniknąć rozwijania symboli zastępczych:
źródło
git fetch --prune <remote> +refs/tags/*:refs/tags/*
nie działał w ZSH, ale działa w BASH*
ale jeśli zacytujesz pojedynczy cytat, powinno być dobrze.git fetch origin --prune --prune-tags
ORgit fetch origin --prune 'refs/tags/*:refs/tags/*'
ORgit fetch <url of origin> --prune --prune-tags
ORgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
git fetch origin --prune --prune-tags
przycinaj zarówno zdalne gałęzie śledzenia, jak i tagi. sprawdzone w wersji git 2.18.Jeśli chcesz tylko tych tagów, które istnieją na pilocie, po prostu usuń wszystkie tagi lokalne:
A następnie pobierz wszystkie zdalne tagi:
źródło
xargs
. Jeśli masz więcej tagówARG_MAX
lub podobne ograniczenia, to nie zadziała. Mało prawdopodobne, ale możliwe, i dlategoxargs
jest świetne.git config --global alias.prune-tags '!git tag -d $(git tag) && git fetch --tags'
Obowiązkowe polecenie aliasu. Cieszyć się. :-)Wygląda na to, że najnowsze wersje Gita (jestem na git v2.20) pozwalają po prostu powiedzieć
Dużo czystsze!
https://git-scm.com/docs/git-fetch#_pruning
Możesz także skonfigurować git, aby zawsze przycinał tagi podczas pobierania:
Jeśli chcesz przycinać tagi tylko podczas pobierania z określonego pilota, możesz użyć tej
remote.<remote>.pruneTags
opcji. Na przykład, aby zawsze przycinać tagi podczas pobierania z miejsca pochodzenia, ale nie innych pilotów,źródło
Wszystkie wersje Gita od wersji 1.7.8 rozumieją
git fetch
z refspec, natomiast od wersji 1.1.0--tags
opcja zastępuje--prune
opcję. Aby uzyskać rozwiązanie ogólnego zastosowania, spróbuj:Więcej informacji o tym, jak zmieniło się zachowanie „--tags” z „--prune” w Git v1.9.0, patrz: https://github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c
źródło
origin
zupstream
i git skorygowane moim lokalnym tagów na podstawie Upstream; następniegit push origin :<deleted-tag-name>
zaktualizowałem mój widelec GitHub, usuwając usunięty tag.git fetch --prune --prune-tags origin
git fetch origin --prune --prune-tags
LUBgit fetch origin --prune 'refs/tags/*:refs/tags/*'
LUBgit fetch <url of origin> --prune --prune-tags
LUBgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
Git natywnie obsługuje czyszczenie lokalnych tagów:
To polecenie pobiera najnowsze tagi i usuwa wszystkie usunięte tagi.
źródło
to dobra metoda:
git tag -l | xargs git tag -d && git fetch -t
Źródło: demisx.GitHub.io
źródło
Pokaż różnicę między tagami lokalnymi i zdalnymi:
git tag
podaje listę lokalnych tagówgit ls-remote --tags
daje listę pełnych ścieżek do zdalnych tagówcut -f2 | grep -v '\^' | sed 's#refs/tags/##'
analizuje tylko nazwę znacznika z listy zdalnych ścieżek znacznikówWiersze zaczynające się od „<” to tagi lokalne, których już nie ma w repozytorium zdalnym. Jeśli jest ich niewiele, możesz je usuwać ręcznie jeden po drugim, jeśli jest ich wiele, wykonuj więcej grepowania i orurowania, aby je zautomatyzować.
źródło
diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort) | grep ">" | cut -c3- | xargs -I{} git push origin :refs/tags/{}
diff <(git show-ref --tags | grep -v '{}' | awk '{print $1 " " $2}') <(git ls-remote --tags origin | grep -v '{}' | awk '{print $1 " " $2}')
<
, ale liczba po której następuje przecinek, a następnie coś, co wygląda jak pierwsze trzy znaki skrótu zatwierdzenia (?), np7,8d4
...Właśnie dodałem polecenie git sync-local-tags do pivotal_git_scripts Gem fork na GitHub:
https://github.com/kigster/git_scripts
Zainstaluj klejnot, a następnie uruchom „git sync-local-tags” w swoim repozytorium, aby usunąć tagi lokalne, które nie istnieją na pilocie.
Możesz też po prostu zainstalować poniższy skrypt i nazwać go „git-sync-local-tags”:
źródło
Wiem, że jestem spóźniony na przyjęcie, ale teraz jest na to szybka odpowiedź:
Tak, teraz można pobrać.
Jeśli nie chcesz pobierać i po prostu przyciąć:
źródło
Co powiesz na to - upuść wszystkie lokalne tagi, a następnie ponownie pobierz? Biorąc pod uwagę, że Twoje repozytorium może zawierać submoduły:
źródło
TortoiseGit może teraz porównywać tagi.
Lewy dziennik jest zdalny, prawy lokalny.
Korzystanie z funkcji Porównaj tagi w oknie dialogowym Synchronizacja:
Zobacz także TortoiseGit numer 2973
źródło
Ta sama odpowiedź, co @Richard W, ale dla Windows (PowerShell)
źródło
Dodaję to polecenie
SourceTree
jako akcję niestandardową na moim MacOS.Ustawianie
Custom Actions
wedługSourcetree
->Preferences...
->Custom Actions
Script to run
musi byćgit
ścieżką.Używam
git fetch --prune --prune-tags origin
do synchronizacji tagów ze zdalnego do lokalnego.źródło
W nowej wersji git (jak v2.26.2)
Więc musisz uruchomić:
źródło