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?

0voto

RuntimeException Punkte 1565

Nachdem ich viele Antworten und Beiträge gelesen und einen halben Tag damit verbracht habe, verschiedene Varianten auszuprobieren, bin ich zu folgendem Ergebnis gekommen.

Wenn Sie mit Windows arbeiten, können Sie dieses Skript unter Windows mit Git Bash ausführen, das von Git für Windows bereitgestellt wird (installiert oder portabel).

Dieses Skript benötigt Argumente

\- local path e.g. /d/source/project1
- Git URL e.g. https://username@bitbucket.org/username/project1.git
- password

if a password should not be entered on the command line in plain text,
then modify the script to check if GITPASS is empty; do not
replace and let Git prompt for a password

Das Skript wird

- Find the current branch
- Get the SHA1 of the remote on that branch
- Get the SHA1 of the local on that branch
- Compare them.

Wenn das Skript eine Änderung anzeigt, können Sie mit dem Abrufen oder Ziehen fortfahren. Das Skript ist vielleicht nicht effizient, aber für mich erledigt es die Arbeit.

Update - 30.10.2015: stderr zu dev null, um zu verhindern, dass die URL mit dem Passwort auf der Konsole ausgegeben wird.

#!/bin/bash

# Shell script to check if a Git pull is required.

LOCALPATH=$1
GITURL=$2
GITPASS=$3

cd $LOCALPATH
BRANCH="$(git rev-parse --abbrev-ref HEAD)"

echo
echo git url = $GITURL
echo branch = $BRANCH

# Bash replace - replace @ with :password@ in the GIT URL
GITURL2="${GITURL/@/:$GITPASS@}"
FOO="$(git ls-remote $GITURL2 -h $BRANCH 2> /dev/null)"
if [ "$?" != "0" ]; then
  echo cannot get remote status
  exit 2
fi
FOO_ARRAY=($FOO)
BAR=${FOO_ARRAY[0]}
echo [$BAR]

LOCALBAR="$(git rev-parse HEAD)"
echo [$LOCALBAR]
echo

if [ "$BAR" == "$LOCALBAR" ]; then
  #read -t10 -n1 -r -p 'Press any key in the next ten seconds...' key
  echo No changes
  exit 0
else
  #read -t10 -n1 -r -p 'Press any key in the next ten seconds...' key
  #echo pressed $key
  echo There are changes between local and remote repositories.
  exit 1
fi

-5voto

Pol Dellaiera Punkte 127

Sie können auch finden ein Phing-Skript der das jetzt macht.

Ich brauchte eine Lösung, um meine Produktionsumgebungen automatisch zu aktualisieren, und wir sind dank dieses Skripts, das ich mit Ihnen teile, sehr zufrieden.

Das Skript ist in XML geschrieben und benötigt Phing .

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