Die Option --mirror nutzen, um Branches in Git-Repositories aufzuräumen.

Posted by Start Bootstrap on April 04, 2014

Ab und zu sollte man sein Repository entrümpeln (siehe auch Alte Branches archivieren). Lokal kann man Branches einfach, ändern oder umbenennen. Die Änderungen dann mit einzelnen push-Aufrufen in ein entferntes Repository zu übertragen ist aber umständlich.

Einfacher ist es mit der Option clone --mirror: Sie spiegelt den Zustand aller lokalen Branches in das Zielrepository. Dabei ist es egal, ob die Branches neu angelegt, geändert oder gelöscht wurden. Nach dem Aufruf hat das Zielrepository den gleichen Stand für alle Branches wie das lokale Repository. Man geht wie folgt vor:

  1. Mit clone --mirror eine Arbeitskopie erstellen und
  2. dort mit branch -d und branch -m die Branches bearbeiten und dann
  3. mit push --mirror alle Änderungen übertragen.

Achtung: Ein push von einem mirror-Repository ändert man Branches im Zielrepository, dies hat dieselben Auswirkungen wie ein push --force. Wegen Risiken und Nebenwirkungen lesen die Packungsbeilage oder fragen sie einen Experten.

Beispiel

Ein Repository enthält mehrere Branches.

remoterepo $ git branch
  branch-a
  branch-b
  branch-c
* master

Mit der Option --mirror des clone-Befehls erstellen wir eine Arbeitskopie des Repositorys.

$ git clone --mirror remoterepo localrepo

Alle Branches aus ‘remoterepo’ sind als hier als tracking Branch abgebildet.

localrepo $ git branch -v
  branch-a 0523ff7 create file-a
  branch-b 2582789 create file-b
  branch-c 53ef1a1 create file-c
* master   2aebcc2 create file-master

Diese Branches können wir jetzt nach Lust und Laune bearbeiten.

localrepo $ git branch -f branch-a master       # Zurücksetzen
localrepo $ git branch -D branch-b              # Löschen
localrepo $ git branch -M branch-c moved-c      # Umbenennen
localrepo $ git branch new-branch-d             # Neu anlegen

Ein einfaches push überträgt alles.

localrepo $ git push

Die Branches in beiden Repositorys stimmen überein.

localrepo $ git branch -v
  branch-a     2aebcc2 create file-master
* master       2aebcc2 create file-master
  moved-c      53ef1a1 create file-c
  new-branch-d 2aebcc2 create file-master
remoterepo $ git branch -v
  branch-a     2aebcc2 create file-master
* master       2aebcc2 create file-master
  moved-c      53ef1a1 create file-c
  new-branch-d 2aebcc2 create file-master