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?

1voto

Altzone Punkte 11

Vielleicht dies, wenn Sie die Aufgabe als crontab hinzufügen möchten:

#!/bin/bash
dir="/path/to/root"
lock=/tmp/update.lock
msglog="/var/log/update.log"

log()
{
        echo "$(date) ${1:-missing}" >> $msglog
}

if [ -f $lock ]; then
        log "Already run, exiting..."
else
        > $lock
        git -C ~/$dir remote update &> /dev/null
        checkgit=`git -C ~/$dir status`
        if [[ ! "$checkgit" =~ "Your branch is up-to-date" ]]; then
                log "-------------- Update ---------------"
                git -C ~/$dir pull &>> $msglog
                log "-------------------------------------"
        fi
        rm $lock

fi
exit 0

1voto

Tuxdude Punkte 43955

Ich verwende eine Version eines Skripts, das auf Stephen Habermans Antwort basiert:

if [ -n "$1" ]; then
    gitbin="git -C $1"
else
    gitbin="git"
fi

# Fetches from all the remotes, although --all can be replaced with origin
$gitbin fetch --all
if [ $($gitbin rev-parse HEAD) != $($gitbin rev-parse @{u}) ]; then
    $gitbin rebase @{u} --preserve-merges
fi

Angenommen, dieses Skript wird aufgerufen git-fetch-and-rebase kann es mit einem optionalen Argument aufgerufen werden directory name des lokalen Git-Repositorys, an dem die Operation durchgeführt werden soll. Wird das Skript ohne Argumente aufgerufen, geht es davon aus, dass das aktuelle Verzeichnis Teil des Git-Repositorys ist.

# Operates on /abc/def/my-git-repo-dir
git-fetch-and-rebase /abc/def/my-git-repo-dir

# Operates on the Git repository which the current working directory is part of
git-fetch-and-rebase

Sie ist verfügbar aquí auch.

1voto

jthill Punkte 47948
git ls-remote | cut -f1 | git cat-file --batch-check >&-

listet alles auf, was in irgendeiner Remote referenziert wird, die nicht in Ihrem Repo ist. Um Remote-Ref-Änderungen an Dingen zu erkennen, die Sie bereits hatten (z.B. Zurücksetzen auf frühere Commits), braucht es ein wenig mehr:

git pack-refs --all
mine=`mktemp`
sed '/^#/d;/^^/{G;s/.\(.*\)\n.* \(.*\)/\1 \2^{}/;};h' .git/packed-refs | sort -k2 >$mine
for r in `git remote`; do 
    echo Checking $r ...
    git ls-remote $r | sort -k2 | diff -b - $mine | grep ^\<
done

0voto

Andrew Grothe Punkte 2410

Für die Windows-Benutzer, die auf dieser Frage landen und danach suchen, habe ich einen Teil der Antwort in ein Powershell-Skript umgewandelt. Ändern Sie es nach Bedarf, speichern Sie es in einem .ps1 Datei und kann bei Bedarf oder nach einem Zeitplan ausgeführt werden.

cd C:\<path to repo>
git remote update                           #update remote
$msg = git remote show origin               #capture status
$update = $msg -like '*local out of date*'
if($update.length -gt 0){                   #if local needs update
    Write-Host ('needs update')
    git pull
    git reset --hard origin/master
    Write-Host ('local updated')
} else {
    Write-Host ('no update needed')
}

0voto

Tomas Kukis Punkte 72

Einfache Regexp verwenden:

str=$(git status) 
if [[ $str =~ .*Your\ branch\ is\ behind.*by.*commits,\ and\ can\ be\ fast-forwarded ]]; then
    echo `date "+%Y-%m-%d %H:%M:%S"` "Needs pull"
else
    echo "Code is up to date"
fi

1 Stimmen

Das wird nicht funktionieren. git status ist nur eine lokale Prüfung und würde Ihnen daher nur sagen, ob Ihr Zweig im Rückstand ist, wenn Sie Ihre entfernten Defs bereits aktualisiert haben.

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