Ich arbeite auf zwei verschiedenen Computern (A und B) und speichere eine gemeinsame Git-Fernbedienung im Dropbox-Verzeichnis.
Nehmen wir an, ich habe zwei Zweige, Master und Devel. Beide verfolgen den Ursprung / Master und den Ursprung / die Entwicklung ihrer entfernten Gegenstücke.
Jetzt lösche ich auf Computer A die Zweigentwicklung auf lokaler und entfernter Ebene.
git push origin :heads/devel
git branch -d devel
Wenn git branch -a
ich auf Computer A laufe, erhalte ich die folgende Liste von Zweigen.
- Meister
- Herkunft / KOPF
- Herkunft / Meister
Unter git fetch
Computer B kann ich den lokalen Entwicklungszweig mit git branch -d devel
entfernen, aber den Remote-Entwicklungszweig nicht entfernen.
git push origin :heads/devel
gibt die folgenden Fehlermeldungen zurück.
Fehler: Push an nicht qualifiziertes Ziel nicht möglich: Heads / Proxy3d
Die Zielreferenzspezifikation stimmt weder mit einer vorhandenen Referenz auf der Fernbedienung überein noch beginnt sie mit Referenz /, und wir können kein Präfix basierend auf der Quellreferenz erraten.
tödlich: Das entfernte Ende legte unerwartet auf
git branch -a
listet weiterhin Ursprung / Entwicklung in den entfernten Zweigen auf.
Wie kann ich die Remote-Zweige von Computer B bereinigen?
quelle
Antworten:
Was ist das Ergebnis von
git branch -a
Maschine B?Zweitens haben Sie bereits gelöscht
heads/devel
auforigin
, ist also, warum man es nicht von der Maschine B. löschenVersuchen
oder
oder
Sie können
--dry-run
das Ende Ihrergit
Anweisung hinzufügen , um das Ergebnis der Ausführung zu sehen, ohne sie tatsächlich auszuführen.Dokumente für
git remote prune
undgit branch
.quelle
git remote prune origin
arbeitete für mich =>* [pruned] origin/my-old-branch
git remote prune origin --dry-run
zeigt Ihnen, was gelöscht würde, ohne es tatsächlich zu tun.git fetch origin --prune
war perfekt, um gelöschte Zweige zu entfernengit branch -vv
gefolgt zu seingit branch -D branchname
und schließlich ist die Pflaume der beste Weg.git config remote.origin.prune true
Überlegen Sie, ob Sie Folgendes ausführen möchten:
Regelmäßig in jedem Repo, um lokale Zweige zu entfernen, die einen gelöschten Remote-Zweig verfolgt haben (im Remote-GIT-Repo nicht mehr vorhanden).
Dies kann weiter vereinfacht werden durch
Dies ist eine
per-repo
Einstellung, mit der jede Zukunftgit fetch or git pull
automatisch beschnitten werden kann .Um dies für Ihren Benutzer einzurichten, können Sie auch die globale .gitconfig bearbeiten und hinzufügen
Es wird jedoch empfohlen, dies mit dem folgenden Befehl durchzuführen:
oder um es systemweit anzuwenden (nicht nur für den Benutzer)
quelle
Hier ist ein Bash-Skript, das dies für Sie erledigen kann. Es ist eine modifizierte Version des Skripts http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git . Durch meine Änderung können verschiedene Remote-Standorte unterstützt werden.
quelle
sed
s. Ersetzensed 's/\(.*\)\/\(.*\)/\1/g'
durchsed 's/\([^/]*\)\/\(.*\)/\1/g'
Dieser Befehl "trocken laufen" löscht alle remote (
origin
) zusammengeführten Zweige außermaster
. Sie können dies ändern oder nach dem Master weitere Zweige hinzufügen:grep -v for-example-your-branch-here |
Wenn es gut aussieht, entfernen Sie die
--dry-run
. Darüber hinaus möchten Sie dies möglicherweise zuerst an einer Gabel testen.quelle
Wenn
git branch -r
viele Remote-Tracking-Zweige angezeigt werden, an denen Sie nicht interessiert sind und die Sie nur aus dem lokalen Bereich entfernen möchten, verwenden Sie den folgenden Befehl:Eine sicherere Version wäre, nur die zusammengeführten zu entfernen:
Dies kann für große Projekte nützlich sein, bei denen Sie nicht die Feature-Zweige anderer Teammitglieder benötigen, aber beim ersten Klon viele Remote-Tracking-Zweige abgerufen werden.
Dieser Schritt allein reicht jedoch nicht aus, da diese gelöschten Fernverfolgungszweige als nächstes wiederkommen würden
git fetch
.Um das Abrufen dieser Remote-Tracking-Zweige zu beenden, müssen Sie die Refs, die in .git / config abgerufen werden sollen, explizit angeben :
Im obigen Beispiel holen wir nur
master
,develop
und lassen Sie Zweige, fühlen Sie sich frei anpassen , wie Sie benötigen.quelle
git fetch origin branchname
oder einen Alias erstellenft = "!f() { git fetch origin $(git rev-parse --abbrev-ref HEAD);}; f"
, um nur den aktuellen Zweig abzurufen (mein persönlicher Favorit). Prost.-r
Flagge? Ich sehe,xargs
hat ein-R
Argument, aber nichts gefunden-r
. Ich meine, theoretisch, wenn ich mich richtig erinnere, wie esxargs
funktioniert, sollte es auch ohne-r
funktionieren.| xargs git branch -d
. Durch Entfernen der-r
Option (--remotes
) werdengit branch -d
nur die lokalen Zweige bereinigt (was möglicherweise ausreicht, wenn man bedenkt, dass standardmäßiggit branch
ohnehin keine entfernten Zweige angezeigt werden).xargs -r
, nämlich--no-run-if-empty
, es ist eine GNU-Erweiterung bedeutet, hier ist eine schöne Erklärung .Das Löschen ist immer eine herausfordernde Aufgabe und kann gefährlich sein !!! Führen Sie daher zuerst den folgenden Befehl aus, um zu sehen, was passieren wird:
Auf diese Weise erhalten
git
Sie eine Liste der Vorgänge, die bei Ausführung des folgenden Befehls ausgeführt werden.Führen Sie dann den folgenden Befehl aus, um alle Zweige aus dem Remote-Repo zu entfernen, die sich nicht in Ihrem lokalen Repo befinden:
quelle
-n
diesem Befehl (Trockenlauf) hinzuzufügen, damit Sie eine Vorschau der Änderungen anzeigen können. Wenn alles in Ordnung ist, rufen Sie ihn erneut ohne auf-n
.So geht's mit SourceTree (v2.3.1):
1. Klicken Sie auf Abrufen.
2. Aktivieren Sie "Prune Tracking-Zweige ...".
3.
Drücken Sie OK. 4. 😀
quelle
Ich muss hier eine Antwort hinzufügen, da die anderen Antworten entweder meinen Fall nicht abdecken oder unnötig kompliziert sind. Ich verwende Github mit anderen Entwicklern und möchte nur, dass alle lokalen Zweige, deren Fernbedienungen (möglicherweise zusammengeführt und) aus einem Github-PR gelöscht wurden, auf einmal von meinem Computer gelöscht werden. Nein, Dinge wie
git branch -r --merged
decken nicht die Zweige ab, die nicht lokal zusammengeführt wurden, oder diejenigen, die überhaupt nicht zusammengeführt wurden (aufgegeben) usw., daher ist eine andere Lösung erforderlich.Wie auch immer, der erste Schritt, den ich aus anderen Antworten bekam:
Ein trockener Lauf von
git remote prune origin
schien in meinem Fall dasselbe zu tun, also habe ich mich für die kürzeste Version entschieden, um es einfach zu halten.Jetzt
git branch -v
sollte a die Zweige markieren, deren Fernbedienungen als gelöscht werden[gone]
. Daher muss ich nur Folgendes tun:So einfach ist das, es löscht alles, was ich für das obige Szenario will.
Die weniger verbreitete
xargs
Syntax ist, dass sie neben Linux auch auf Mac & BSD funktioniert. Vorsicht, dieser Befehl ist kein Trockenlauf, daher werden alle als gekennzeichneten Zweige erzwungen[gone]
. Wenn Sie sehen, dass Zweige gelöscht wurden, an die Sie sich erinnern, dass Sie sie behalten möchten, können Sie sie jederzeit wiederherstellen (der obige Befehl hat ihren Hash beim Löschen aufgelistet, also einfachgit checkout -b <branch> <hash>
.quelle
Beschneiden Sie die gleichen Zweige von lokalen und Remote-Refs (in meinem Beispiel von
origin
).quelle