746 Stimmen

Prüfen, ob ein Pull in Git erforderlich ist

Wie prüfe ich, ob sich das entfernte Repository geändert hat und ich einen Pull durchführen muss?

Jetzt verwende ich dieses einfache Skript:

git pull --dry-run | grep -q -v 'Already up-to-date.' && changed=1

Aber es ist ziemlich schwer.

Gibt es einen besseren Weg? Die ideale Lösung würde alle entfernten Zweige überprüfen und die Namen der geänderten Zweige sowie die Anzahl der neuen Übertragungen in jedem Zweig zurückgeben.

16 Stimmen

Bitte beachten Sie: "git pull --dry-run" funktioniert nicht so, wie vermutlich erwartet. Es scheint, dass git pull unbekannte Optionen direkt an git fetch weitergibt. Das Ergebnis ist das eines normalen git pull.

34 Stimmen

"pull" ist nur ein kurzer Weg, um "fetch" und "merge" auf einmal zu machen, wenn Sie den Status der entfernten Repo überprüfen müssen, simulieren Sie wirklich ein "fetch". Also git fetch -v --dry-run ist das, was Sie brauchen.

0 Stimmen

Ich habe die von OP vorgeschlagene Lösung ausprobiert, und es hat nichts gebracht. Wahrscheinlich nicht der beste Ansatz?

11voto

thuovila Punkte 1920

Es gibt bereits viele sehr funktionsreiche und ausgeklügelte Antworten. Um etwas Kontrast zu schaffen, könnte ich mich mit einer sehr einfachen Zeile begnügen.

# Check return value to see if there are incoming updates.
if ! git diff --quiet remotes/origin/HEAD; then
 # pull or whatever you want to do
fi

2 Stimmen

In der ursprünglichen Antwort fehlte ein '!' in der if-Anweisung. Der Rückgabewert von git diff ist Null, wenn es keine Änderungen gibt.

1 Stimmen

IMO die beste Lösung, auch wenn ich "remotes/origin/HEAD" durch "origin/master" oder eine andere Revision ersetzen muss

6voto

Claudio Floreani Punkte 2259

Ich würde den von brool vorgeschlagenen Weg gehen. Das folgende einzeilige Skript vergleicht den SHA1-Wert der zuletzt übertragenen Version mit dem des entfernten Ursprungs und zieht die Änderungen nur, wenn sie sich unterscheiden. Und es ist sogar die leichteste der Lösungen, die auf git pull o git fetch .

[ `git log --pretty=%H ...refs/heads/master^` != `git ls-remote origin
-h refs/heads/master |cut -f1` ] && git pull

0 Stimmen

Dieser Befehl schlägt fehl, wenn das Git-Repository mit "--depth 1" geklont wird (um die Downloadgröße zu begrenzen). Wissen Sie, ob es eine Möglichkeit gibt, dies zu beheben?

0 Stimmen

Das Git-Log gibt viele Zeilen zurück und gibt einen Fehler "bash: [: zu viele Argumente" Ich würde wechseln zu git rev-parse --verify HEAD

1 Stimmen

Dies ist ein einfacher String-Vergleich, der von der Bash durchgeführt wird. Wenn etwas fehlschlägt, würde ich Ihnen vorschlagen, Ihre Syntax zu überprüfen (d.h. Sie tippen es falsch). Erster Durchlauf git log --pretty=%H ...refs/heads/master^ um den SHA1-Wert der zuletzt übertragenen Version zu erhalten, und führen Sie dann git ls-remote origin -h refs/heads/master |cut -f1 um den SHA1 des entfernten Ursprungs zu erhalten. Diese beiden Befehle sind Git-Befehle und haben nichts mit der Bash zu tun. Was die Bash innerhalb der eckigen Klammern tut, ist, die Ausgabe des ersten Befehls mit der des zweiten zu vergleichen, und wenn sie gleich sind, gibt sie true zurück und führt git pull .

6voto

Gilles Quenot Punkte 153339

Wenn Sie dieses Skript ausführen, prüft es, ob der aktuelle Zweig eine git pull :

#!/bin/bash

git fetch -v --dry-run 2>&1 |
    grep -qE "\[up\s+to\s+date\]\s+$(
        git branch 2>/dev/null |
           sed -n '/^\*/s/^\* //p' |
                sed -r 's:(\+|\*|\$):\\\1:g'
    )\s+" || {
        echo >&2 "Current branch need a 'git pull' before commit"
        exit 1
}

Es ist sehr praktisch, es als Git-Hook vor dem Commit zu setzen, um zu vermeiden, dass

Merge branch 'foobar' of url:/path/to/git/foobar into foobar

wenn Sie commit vor pulling .

Um diesen Code als Hook zu verwenden, fügen Sie das Skript einfach in

.git/hooks/pre-commit

et

chmod +x .git/hooks/pre-commit

6voto

che Punkte 11861

Ausführen. git fetch (remote) um Ihre Remote-Referenzen zu aktualisieren, wird Ihnen angezeigt, was neu ist. Wenn Sie dann Ihren lokalen Zweig auschecken, wird er Ihnen zeigen, ob er hinter dem Upstream zurückbleibt.

0 Stimmen

Ich glaube, er hat bereits die örtliche Niederlassung überprüft, also braucht er etwas anderes, um zu zeigen, ob es dahinter steckt usw. Er kann dies mit git status tun.

0 Stimmen

Stimmt, nachdem Sie die Fernbedienungen geholt haben, git status wird dies ebenfalls zeigen.

1 Stimmen

Das ist etwas für die Stimmung git pull --dry-run tut, aber ich denke, es ist zu schwer für ein Cron-Skript, das jede Minute läuft.

6voto

Digital Human Punkte 1524

All diese komplexen Vorschläge, während die Lösung so kurz und einfach ist:

#!/bin/bash

BRANCH="<your branch name>"
LAST_UPDATE=`git show --no-notes --format=format:"%H" $BRANCH | head -n 1`
LAST_COMMIT=`git show --no-notes --format=format:"%H" origin/$BRANCH | head -n 1`

git remote update
if [ $LAST_COMMIT != $LAST_UPDATE ]; then
        echo "Updating your branch $BRANCH"
        git pull --no-edit
else
        echo "No updates available"
fi

0 Stimmen

LAST_COMMIT und LAST_UPDATE sind immer gleich, auch wenn es Änderungen gibt

1 Stimmen

Diese Lösung ist gut und einfach, setzt aber voraus, dass git remote update die vor Ihrem Code ausgeführt wird, um die neuesten Origin-Commit-Informationen zu erhalten

0 Stimmen

Sollte git remote update nicht anhängen vor git show Befehle ?

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