2016-08-07 25 views
1

Mein Ziel ist es, eine "Backup-Repo" -Option in einer Benutzeroberfläche nur anzubieten, wenn die letzte Sicherung nicht mehr gültig ist. Daher brauche ich einen effizienten Weg, um festzustellen, ob überhaupt Änderungen am Repo vorgenommen wurden.Wie kann ich feststellen, ob eine Änderung an einem Git Repo vorgenommen wurde?

Mein erster Gedanke ist es, die Änderungszeiten jedes Verzeichnisses im Repo zusammenzufassen, was ich mit dem gleichen Wert vergleichen würde, der für das Backup berechnet wurde. Funktioniert das? Gibt es einen besseren Weg?

+0

Zwei Kommentare zu den Antworten bisher: (1) Ich gehe nicht davon aus, dass es ein Remote Repo gibt. (2) Ich interessiere mich für den gesamten Inhalt des Repos, nicht nur für einen Zweig und nicht nur für die verwalteten Dateien.Das Ändern einer Konfiguration oder das Hinzufügen eines Tags würde als Änderung gelten, da dies bedeutet, dass ich die Sicherung aktualisieren muss. Um es klar zu sagen, ich habe es mit einem sehr großen Repo zu tun, der nicht sehr oft geändert wird und ihn daher von den normalen periodischen inkrementellen Backups ausschließt. –

Antwort

0

Sie die Ausgabe analysieren kann ...

git fetch --dry-run origin 
0

... Mein erster Gedanke ist es, die Änderungszeiten jedes Verzeichnis im Repo-Hash zusammen, die ich mit dem gleichen Wert vergleichen, würde berechnet auf dem Backup. Funktioniert das? Gibt es einen besseren Weg?

yep, können Sie überprüfen, ob es irgendwelche ausstehenden Änderungen vom Server sind:

# grab all latest changes 
git fetch 

# check to see if there are any changes 
git diff <origin/branch> ^branch 

# or 
git diff ^<branch> origin/branch 

One für Zug- und zweite ist für Push


Ein anderer Weg ist Zum Abrufen und Bräunen zählen Sie die Anzahl der Commits in jedem Zweig, vorausgesetzt, Sie führen keine interaktive Rebase [Squash] durch.

git rev-list --count 
1

Sie wirklich wollen nur, wenn (nach Abholen) Remote-Tracking-Zweig Herkunft/Zweig, um zu sehen das gleiches wie Ihrem lokalen Tracking-Zweig ist, so dass nur der von solchen des SHA überprüfen (durch eine Zusammenführung gefolgt Sie aufholen). Sie könnten also einfach eine rev-Analyse auf Herkunft/Zweig durchführen und diese mit der rev-Analyse vergleichen, da es nicht darauf ankommt, wie viele Commits oder was die Änderungen waren, nur, dass es Änderungen gab (oder ein Git-Log --oneline Herkunft/Branch..branch piped zu einem wc-l, Art der Sache).

Ihre Idee von dem Hash über das gesamte Verzeichnis ist ähnlich wie die SHA des Commits tatsächlich berechnet wird, so dass nur die Verwendung der SHA das erreicht. Beachten Sie, dass mein Vorschlag scheitern würde, wenn jemand einen Commit und dann einen Revert ausführen würde und Sie den gleichen Inhalt haben. Die SHAs würden sich mit jedem weiteren Commit ändern (da sie auch die Commit-Informationen sowie den SHA enthalten), aber Ich würde denken, dass es ein unwahrscheinliches Szenario ist und nicht für das Sie optimieren müssen.

Also mein Ansatz geht davon aus, dass Sie einen lokalen Repo haben, den Sie von der Fernbedienung klonen. Wenn nicht, oder wenn Sie nicht den gesamten Remote-Repo herunterziehen möchten, können Sie einen flachen Klon erstellen, um den Tipp zu erhalten und sich daran zu erinnern, was der Tipp zuvor war.

Ein besserer Ansatz ist es jedoch, git ls-remote zu verwenden und diese Ausgabe zu analysieren und sich an ihren Zustand zu erinnern und sie beim nächsten Mal zu vergleichen.

NAME 
     git-ls-remote - List references in a remote repository 

SYNOPSIS 
     git ls-remote [--heads] [--tags] [--upload-pack=<exec>] 
        [--exit-code] <repository> [<refs>...] 

DESCRIPTION 
     Displays references available in a remote repository along with the associated commit IDs. 

Sie eine Ausgabe wie die folgende sehen:

From https://github.com/foobar/myRepo.git 
3133d81f8cca51c73c92aeeaa1c762b177683456 HEAD 
3133d81f8cca51c73c92aeeaa1c762b177683456 refs/heads/master 

Sie sehen also, es HEAD des Remote-Listen sowie die Refs und seine eine einfache Sache davon Parsen und es zu speichern.