Meine Situation ist folgende: Jemand, der am selben Repo arbeitet, hat einen Zweig aus seinem lokalen und Remote-Repo gelöscht ...
Die meisten Personen, die bei Stack Overflow oder anderen Websites nach solchen Problemen gefragt haben, haben das Problem, dass Zweige weiterhin in ihrer Liste git branch -a
der Fernverfolgungszweige unten angezeigt werden:
* master
develop
feature_blah
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
remotes/origin/random_branch_I_want_deleted
In MEINER Situation ist die Niederlassung, die nicht vorhanden sein sollte, lokal:
* master
develop
feature_blah
random_branch_I_want_deleted
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
Wenn ich eine der folgenden Aktionen ausführe, wird sie lokal nicht entfernt:
$ git prune
Ich habe auch versucht:
$ git remote prune origin
$ git fetch --prune
Weitere nützliche Informationen: Wenn ich das überprüfe, git remote show origin
sieht es so aus:
* 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)
Beachten Sie, dass es nur im Abschnitt mit dem Titel ist Local branches configured for 'git pull':
Warum?
git
remote-branch
gogogadgetinternet
quelle
quelle
git branch -d the_local_branch
x/y
Antworten:
Ich beschuldige Sie nicht, darüber frustriert zu sein. Der beste Weg, dies zu betrachten, ist dies. Es gibt möglicherweise drei Versionen jedes Remote-Zweigs:
(z. B. Remote-Repo unter https://example.com/repo.git ,
refs/heads/master
)refs/remotes/...
)(z. B. lokales Repo,
refs/remotes/origin/master
)(z. B. lokales Repo
refs/heads/master
).Beginnen wir mit
git prune
. Dadurch werden Objekte entfernt , auf die nicht mehr verwiesen wird, und es werden keine Verweise entfernt. In Ihrem Fall haben Sie eine lokale Niederlassung. Das heißt, es gibt eine Referenz mit dem Namenrandom_branch_I_want_deleted
, die sich auf einige Objekte bezieht, die den Verlauf dieses Zweigs darstellen.git prune
Wird also per Definition nicht entferntrandom_branch_I_want_deleted
. Diesgit prune
ist eine Möglichkeit, Daten zu löschen, die sich in Git angesammelt haben, auf die jedoch von nichts verwiesen wird. Im Allgemeinen hat dies keine Auswirkungen auf Ihre Ansicht von Zweigen.git remote prune origin
undgit fetch --prune
beide arbeiten mit Referenzen unterrefs/remotes/...
(ich werde diese als Fernreferenzen bezeichnen). Lokale Niederlassungen sind davon nicht betroffen. Diegit remote
Version ist nützlich, wenn Sie nur Remote-Referenzen unter einer bestimmten Remote entfernen möchten. Ansonsten machen die beiden genau das Gleiche. Also, kurz gesagt,git remote prune
undgit fetch --prune
arbeiten Sie mit Nummer 2 oben. Wenn Sie beispielsweise einen Zweig über die Git-Web-GUI gelöscht haben und nicht mehr in Ihrer lokalen Zweigliste angezeigt werden sollen (git branch -r
), sollten Sie diesen Befehl verwenden.Um einen lokalen Zweig zu entfernen, sollten Sie verwenden
git branch -d
(oder-D
wenn er nirgendwo zusammengeführt wird). FWIW, es gibt keinen git-Befehl zum automatischen Entfernen der lokalen Verfolgungszweige, wenn ein entfernter Zweig verschwindet.quelle
xargs git branch -D
weiterleiten, aber beachten Sie, dass alle neuen Zweige, die Sie erstellt, aber nie auf den Server verschoben haben, gelöscht werden. Gehen Sie also vorsichtig vor:git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}'
packed-refs
Datei in der.git
Umgebung), daher ist es nicht unbedingt einfach, sie über den Datei-Explorer zu löschen. Verwenden Sie besser die Befehle, um sicherzustellen, dass beide korrekt ausgeführt werden.git remote prune
undgit fetch --prune
machen Sie dasselbe: Löschen Sie die Refs in den Zweigen, die auf der Fernbedienung nicht vorhanden sind, wie Sie sagten. Der zweite Befehl stellt eine Verbindung zur Fernbedienung her und ruft deren aktuelle Zweige ab, bevor er beschnitten wird.Es berührt jedoch nicht die lokalen Zweige, die Sie ausgecheckt haben und mit denen Sie einfach löschen können
Ersetzen
-d
durch,-D
wenn der Zweig nicht an anderer Stelle zusammengeführt wirdgit prune
Wenn Sie etwas anderes tun, werden nicht erreichbare Objekte gelöscht, die Commits, die in keinem Zweig oder Tag erreichbar sind und daher nicht mehr benötigt werden.quelle
git prune
sucht aber nicht nur nach Zweigen und Tags, sondern auch nach allen anderen Refs.git remote prune
Für den Fall, dass jemand interessiert wäre. Hier ist ein schnelles Shell-Skript, mit dem alle lokalen Zweige entfernt werden, die nicht remote verfolgt werden. Ein Wort der Vorsicht: Dadurch werden alle Zweige entfernt, die nicht remote verfolgt werden, unabhängig davon, ob sie zusammengeführt wurden oder nicht.
Wenn ihr irgendwelche Probleme damit seht, lasst es mich bitte wissen und ich werde es beheben (usw. usw.)
Speichern Sie es in einer Datei mit dem Namen
git-rm-ntb
(nennen Sie es wie auch immer)PATH
und führen Sie Folgendes aus:git-rm-ntb <remote1:optional> <remote2:optional> ...
quelle
Beachten Sie, dass ein Unterschied zwischen
git remote --prune
undgit fetch --prune
mit Commit 10a6cc8 von Tom Miller (tmiller
) behoben wird (für Git 1.9 / 2.0, Q1 2014):Also: wenn eine Upstream - Repo hat einen Zweig ( „frotz“) mit dem gleichen Namen wie eine Zweig Hierarchie ( „frotz / xxx“, eine mögliche Zweignamenskonvention ),
git remote --prune
wurde Nachfolger (in der Reinigung die Fernortungs Niederlassung von Ihrem Repo - up) ,git fetch --prune
scheiterte aber.Nicht länger:
quelle