Überspringen Sie das Kopieren einiger Branches/Tags in lokales Git mit `git fetch –all`

Lesezeit: 4 Minuten

Benutzer-Avatar
Palazzo-Zug

Ich habe viele Fernbedienungen zu meinem Git hinzugefügt. Jede Fernbedienung ist ein Repository für einen Entwickler. Jeden Tag ich fetch --all um alle neu erstellten Branches zu sehen, die zur Überprüfung bereit sind.

Entwickler können jedoch “private” Branches auf die Remote übertragen. Angenommen, alle Zweige, die mit einem Unterstrich-Präfix benannt sind, sind nicht zur Überprüfung bereit, während andere Zweige zur Überprüfung bereit sind.

Beim Tun der git fetch --allmein Git-Graph (von /libexec/git-core/git-gui) sehen alle Branches, egal ob sie den Unterstrich als Präfix haben oder nicht. Das verkompliziert die Grafik.

Ich will git fetch diese zu ignorieren _XXXX Branches nicht auf mein lokales Git heruntergeladen werden. Wenn ich mir also das Git-Diagramm ansehe, sieht es so aus:

  • Zeigt Zweige: RemoteA/Branch1 , RemoteB/Branch1, RemoteB/Branch2
  • Ignoriert Verzweigungen: RemoteA/_Branch2, RemoteB/_Branch3

Wie kann ich das machen?

  • Mehr dazu negative Referenzspez eingeführt mit Git 2.29 (Q4 2020), siehe „Git – Was ist „Refspec““.

    – VonC

    9. Oktober 2020 um 21:03 Uhr


  • Tatsächlich git fetch --all bedeutet Abrufen von allen entfernten Zweigen, wenn Sie mehr als einen haben, nicht von allen entfernten Branches/Tags. Letzteres wird tatsächlich von den Abrufspezifikationen gesteuert, also in +refs/heads/*das * bedeutet, alle Köpfe von dieser Fernbedienung abzurufen. Sie können also entweder die gewünschten explizit angeben oder eine negative Abrufspezifikation mit Git 2.29+ verwenden

    – Ryenus

    4. November 2020 um 3:18 Uhr


Benutzer-Avatar
Michael

Update für Git v2.29.0

Mit negative Refspecs,1 in Git v2.29 hinzugefügt, können Sie Ihre ursprüngliche Absicht erreichen, ohne die Gewohnheiten Ihrer Mitarbeiter zu ändern.

Fügen Sie für die Fernbedienung jedes Kollegen eine negative Refspec hinzu (d. h. mit dem Präfix ^) ausschließen _-vorangestellte Zweige. Dies ist lose angepasst von der Unit-Test für .git/config und die für negative Muster. Siehe die letzte Zeile im Codeblock unten für “Freds” Fernbedienung.

[remote "fred"]
    url = something.git
    fetch = +refs/heads/*:refs/remotes/fred/*
    fetch = ^refs/heads/_*

Sie haben zwei Möglichkeiten, dies festzulegen fred auf der Kommandozeile:

  • git config --add remote.fred.fetch '^refs/heads/_*'
  • git remote set-branches --add fred '^refs/heads/_*'

Ursprüngliche Antwort

Erweitern Sie die ausgezeichnete Antwort von VonC um einen speziellen „Rezension“-Ordner,2 Sie können Ihre ändern .git/config‘s-Einträge für die Fernbedienungen Ihrer Kollegen. Hier ist die entsprechende Dokumentation.

Wo es einmal war

[remote "fred"]
    url = something.git
    fetch = +refs/heads/*:refs/remotes/fred/*

Sie können es zu ändern

[remote "fred"]
    url = something.git
    fetch = +refs/heads/review/*:refs/remotes/fred/review/*
    fetch = +refs/heads/other_pattern/*:refs/remotes/fred/other_pattern/*
    fetch = +refs/heads/specific_branch:refs/remotes/fred/specific_branch

Danach müssen Sie möglicherweise die Verweise auf Refs bereinigen, die Sie bereits abgerufen haben, aber in der Zukunft liegen git fetch --alls oder git fetch freds aktualisiert nichts außerhalb der von Ihnen angegebenen Muster.


1 Am 23.02.2022 gibt es immer noch keine Dokumentation zu negativen Refspecs, daher ist der beste Ort, um nachzusehen in der Geschichte von Git oder in der Antwort von VonC auf eine andere Frage, wo er die relevanten Teile zusammenzieht.
2 Oder so viele spezielle oder interessante Ordner und Zweige, wie Sie brauchen.

Benutzer-Avatar
VonC

Anstatt ein ‘_‘ Namenskonvention könnten Sie Namensräume verwenden und den Zweig hineinschieben origin/review/Branch1 (git push Branch1:review/Branch1)
(in dieser Antwort als “Gruppe” oder in dieser Antwort als “hierarchischer Zweigname (Zweignamen mit Schrägstrich)” bezeichnet)

Auf diese Weise müssen Sie nur abrufen, was sich im Namespace “review” befindet:

git fetch +refs/heads/review/*:refs/remotes/origin/review/*

Die einzige andere Option wäre ein Skript, das Folgendes tun würde:

  • Listen Sie die entfernten Zweige auf (ohne etwas abzurufen): git ls-remote origin
  • Holen Sie für jeden Zweig mit dem richtigen Namen nur diesen Zweig

  • aber wie geht das für alle remote? git fetch +refs/heads/review/*:refs/remotes/origin/review/* bedeutet, dass ich RemoteA in den Befehl eingeben muss, um ‘origin’ zu ersetzen. Etwas Ähnliches, aber Arbeit für –all?

    – Palazzo-Zug

    29. Oktober 2014 um 6:57 Uhr


  • @palazzotrain müssen Sie alle Ihre Fernbedienungen durchlaufen (aufgelistet von git remote): leicht skriptfähig.

    – VonC

    29. Oktober 2014 um 7:02 Uhr

  • @Michael Von github.com/git/git/commit/…der Refspec-Code ist drin github.com/git/git/blob/…. Darin befindet sich kein Shell-Expansionsmechanismus.

    – VonC

    19. Juli 2019 um 15:09 Uhr

  • @Michael Zurück in Git 1.5 (Nov. 2006) wurde die Erweiterung bereits durch Code durchgeführt: github.com/git/git/commit/…

    – VonC

    19. Juli 2019 um 15:10 Uhr

  • @Michael Eine weitere Bestätigung Ihrer Antwort unten finden Sie unter stackoverflow.com/a/35995983/6309.

    – VonC

    19. Juli 2019 um 15:18 Uhr

Benutzer-Avatar
SzG

Sie könnten dies in einem Schritt mit einem Alias ​​tun. Fügen Sie dies zu Ihrem hinzu ~/.gitconfig Datei:

[alias]
    fall = !sh -c 'git fetch --all && git branch -r | sed /HEAD/d | grep /_ | xargs git branch -dr' --

Und dann einfach sagen git fall. Es löscht alle entfernten Zweige, die enthalten /_.

Sie können die Feinheiten von Aliasnamen beobachten, die Shell-Befehle sind. :-/

Benutzer-Avatar
Dinesh

Du könntest die verwenden ignore-refs Möglichkeit:

git fetch --ignore-refs branch123

1011220cookie-checkÜberspringen Sie das Kopieren einiger Branches/Tags in lokales Git mit `git fetch –all`

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy