402 Stimmen

Wie kann ich Git Pull dazu bringen, Rebase standardmäßig für alle meine Repositories zu verwenden?

Gibt es eine Möglichkeit, das Host-Git-Repository so einzurichten, dass jede git pull von seinen (lokalen) Klonen durchgeführt wird, verwendet --rebase standardmäßig? Bei der Suche auf Stack Overflow habe ich erfahren, dass branch.autosetuprebase aber es muss für jeden Klon einzeln konfiguriert werden.

Mein Projektablauf ist so aufgebaut, dass wir pull die develop Verzweigung vor merge einen Feature-Zweig dazu. Diese pull verwendet fast immer --rebase Ich versuche also herauszufinden, ob dies der Standard sein kann.

477voto

Parker Coates Punkte 7027

Es gibt jetzt 3 verschiedene Konfigurationsebenen für das standardmäßige Pull-Verhalten. Sie reichen von der allgemeinsten bis zur feinsten Abstufung:

1. pull.rebase

Diese Einstellung auf true bedeutet, dass git pull ist immer gleichbedeutend mit git pull --rebase (es sei denn branch.<branchname>.rebase explizit festgelegt ist auf false ). Dies kann auch pro Repository oder global festgelegt werden.

2. branch.autosetuprebase

Diese Einstellung auf always bedeutet, dass jedes Mal, wenn ein Verfolgungszweig erstellt wird, ein Konfigurationseintrag wie der unten stehende für ihn erstellt wird. Für eine feiner abgestufte Kontrolle kann dies auch auf never , local ou remote und kann pro Repository oder global festgelegt werden. Siehe git config --help für weitere Einzelheiten.

3. branch.<branchname>.rebase

Diese Einstellung auf true bedeutet, dass dieser bestimmte Zweig immer von seinem Upstream über Rebasing gezogen wird, es sei denn git pull --no-rebase explizit verwendet wird.

Schlussfolgerung

Während Sie also das Standardverhalten für alle zukünftigen Klone eines Repositorys nicht ändern können, können Sie das Standardverhalten für alle (bestehenden und zukünftigen) Repositorys des aktuellen Benutzers über git config --global pull.rebase true .

349voto

mackuntu Punkte 3996

Wie wäre es mit

git config --global pull.rebase true

Damit wird git angewiesen, immer mit rebase zu ziehen.

82voto

Flimm Punkte 112964

Die Antwort ist nein.

Es gibt keine Möglichkeit, ein entferntes Repository so einzurichten, dass jeder, der es klont, das Standardverhalten von git pull geändert.

Sie können jedoch einen serverseitigen Hook einrichten, der überprüft, dass niemand Merge-Commits verschiebt ( etwas wie dies vielleicht).

Es gibt auch einige Konfigurationsoptionen, die für Sie von Interesse sein könnten. Alle Entwickler, die aus dem entfernten Repository klonen, müssen diese selbst manuell einstellen.

1. Option branch.<name>.rebase

Sie können einen lokalen Zweig so konfigurieren, dass er immer --rebase und zwar so, dass sie <name> mit dem Namen einer Verzweigung:

git config branch.<name>.rebase true

Nachdem ich dies auf master die master Abschnitt in .git/config sah so aus:

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2. Option branch.autosetuprebase

Da die Ausführung des vorherigen Konfigurationsbefehls für jeden Git-Zweig mühsam sein kann, können Sie Git so konfigurieren, dass er automatisch für jeden neuen Zweig eingerichtet wird:

git config branch.autosetuprebase always

(Sie können auch angeben never , remote y local siehe man git-config für Details).

Ohne die --global wird die Konfiguration gespeichert in .git/config und nur das aktuelle Repository ist betroffen. Mit --global wird die Konfiguration gespeichert in ~/.gitconfig und jedes unkonfigurierte Repository ist davon betroffen.

Diese Option hat keine Auswirkungen auf bereits bestehende Zweige.

3. Option pull.rebase

git config pull.rebase true

(Sie können ihm auch die --global Option).

Wenn diese Option wahr ist, wird die Ausführung von git pull ist gleichbedeutend mit git pull --rebase es sei denn branch.<name>.rebase wurde festgelegt auf false .

8voto

David Punkte 2869

Derzeit gibt es keine Möglichkeit, die Standardrichtlinie für ein Repository festzulegen.

Wenn Sie es für sich selbst wollen und mindestens git 1.7.9 verwenden, können Sie global die pull.rebase Konfiguration wie folgt:

git config --global pull.rebase true

Aber das müssen Sie auf jedem Rechner tun. Eine Möglichkeit wäre, die Standardvorlage für das Benutzer-Homeboard/Skelett mit dieser Option zu konfigurieren. Die Benutzer könnten diese Option jedoch ändern.

Wenn Sie keine Zusammenführungen wünschen, können Sie einen serverseitigen Haken definieren, um Pushes mit Zusammenführungen abzulehnen.

Zu Ihrer Information, das ist die Quellendokumentation für pull.rebase:

Wenn diese Option auf "true" gesetzt wird, werden die Zweige auf dem geholten Zweig neu gebasht, anstatt den Standardzweig aus der Standard-Remote zusammenzuführen, wenn "git pull" ausgeführt wird. [ ] Basis einzustellen.

Übergeben Sie beim Zusammenführen die Option --rebase-merges an git rebase, damit die lokalen Zusammenführungs-Commits in die rebase aufgenommen werden (siehe git-rebase für Details).

Wenn Sie preserve verwenden, geben Sie auch --preserve-merges an git rebase weiter, damit lokal übertragene Merge-Commits nicht durch die Ausführung von git pull.

Wenn der Wert interaktiv ist, wird die Umbasierung im interaktiven Modus ausgeführt.

HINWEIS: Dies ist ein möglicherweise gefährlicher Vorgang; verwenden Sie ihn nur, wenn Sie sich über die Auswirkungen im Klaren sind (siehe git-rebase für Details).

4voto

Daishi Punkte 10471

Dies macht die --rebase die Standardeinstellung beim Ausstellen einer git pull in einem bestimmten Zweig.

@Flimm, ich musste hinzufügen true um Ihre erste Option zu verwirklichen.

Die korrekte Syntax lautet also:

git config branch.<branch>.rebase true

Zur Ausführung dieses Befehls auf dem develop Zweigstelle:

git config branch.develop.rebase true

Und jetzt die develop Abschnitt in .git/config sieht so aus:

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X