2010-11-08 22 views
13

Wie kann überprüft werden, ob das Commit mit dem angegebenen Sha im aktuellen Zweig existiert?Überprüfen, ob ein Commit vorhanden ist

Es gibt viele Möglichkeiten, Ausgänge zu analysieren, aber ich brauche optimale Möglichkeit, die Boolean zurückgibt (für die Verwendung in Bash-Skript).

z.B. in conditionals

sha=$1 
if [ -z `git magic --validate $sha` ]; then 
    echo "Invalid commit sha: $sha" 
    exit 1 
fi 
+0

möglich Duplikat [Wie kann ich, wenn man sagen begehen ist ein Vorfahre eines anderen commit (oder umgekehrt)?] (Http://stackoverflow.com/questions/ 18345157/how-can-i-tell-wenn-ein-commit-ist-ein-Vorfahren-eines-anderen-commit-oder-umgekehrt) – tavnab

Antwort

5

Die rev-list | grep Methode funktioniert fein; Es gibt ein winziges bisschen Overhead, weil Git alle SHA1s für grep ausdrucken muss, um zu sehen, aber es ist nicht wirklich eine große Sache.

Sie können es auch tun, mit git merge-base wenn Sie mögen - wenn die Merge-Basis des Ziels begehen und die Verzweigung ist das Ziel verpflichten, der Zweig das Ziel enthält begehen:

if [ "$(git merge-base $commit $branch)" = "$commit" ]; then 
    ... 
fi 

Wie auch immer Sie es tun Beachten Sie, dass rev-list und merge-base SHA1s gedruckt werden. Wenn das Commit, das Sie für die Aufnahme testen, durch einen Zweig oder ein Tag benannt wird, sollten Sie zuerst git rev-parse verwenden, um es in ein SHA1 umzuwandeln.

+0

Nur eine kleine Notiz: der POSIX-String gleich Operator ist '=', nicht '=='. Bash wird beides akzeptieren. –

+0

@Sven: Danke, das vergesse ich immer. – Cascabel

+1

Für eine kleine Optimierung ist es nützlich, 'git rev-list -qn1 2>/dev/null' zu verwenden, das den gesamten Commit-Baum nicht durchläuft und mit einem Nicht-Null-Exit-Code endet, wenn das gegebene Commit durchgeführt wird nicht existieren. – nvie

1
git rev-list branch-youre-interested-in | grep -q sha-youre-interested-in 

können Sie die von grep Exit-Code verwenden.

Für den aktuellen Zweig,

git rev-list HEAD | grep -q sha-youre-interested-in 
4

Sie am Ausgang des

git rev-list HEAD..$sha 

aussehen kann, wenn dieser Befehl fehlschlägt, weil die SHA1 im Repository gar nicht existiert, wird der Exit-Code nicht Null sein. Wenn die Ausgabe leer ist, befindet sich das Commit im aktuellen Zweig, und wenn es nicht leer ist, ist es nicht. Also Ihr Skript wie

if revlist=`git rev-list HEAD..$sha 2>/dev/null` && [ -z "$revlist" ]; then 
    : 
fi 

Im Fall aussehen würde Sie bereits wissen, dass $sha wirklich Namen ein commit (als SHA1-Hash oder auf andere Weise), vereinfacht dies

if [ -z "`git rev-list HEAD..$sha`" ]; then 
    : 
fi 
17

Verifiziert nicht wirklich, dass commit (ich glaube, SHA1 ist, was gemeint ist) existiert. Es überprüft, ob in der Datenbank ein Objekt vorhanden ist, das dem bereitgestellten SHA1 entspricht. Das heißt, wenn ein BLOB- oder Tree-Objekt vorhanden ist, das mit dem SHA1 übereinstimmt, wird gemeldet, dass es existiert, auch wenn es kein Commit ist.

git rev-parse --quiet --verify <sha1>^{commit} 

Dies wird sicherstellen, dass das Objekt vorhanden ist, und dass es ein Objekt, das als ein commit (Commit oder kommentierten Tag) genutzt werden kann.

+0

Dies beschränkt jedoch nicht die Befunde auf den aktuellen Zweig, wie vom OP gefordert. – sschuberth

1

Die git cat-Datei gibt Informationen über die Objekte im Repository aus. „-e“ überprüft, ob das Objekt gültig ist, und endet mit einem 0-Status und wenn ungültige existiert mit 1.

git cat-file -e 3d68db1028afe27a0055c2234f98fc945b1958f5 
echo $? 
1 
2
git merge-base --is-ancestor $sha HEAD 

Dieses prüft, ob $sha ist ein Vorfahre verpflichten für den aktuellen Zweig (HEAD) und wird erfolgreich beendet, wenn dies der Fall ist.

In Ihrem Beispiel

sha=$1 
if ! git merge-base --is-ancestor $sha HEAD; then 
    echo "Invalid commit sha: $sha" 
    exit 1 
fi 
+0

Diese Option ist seit Git 1.9.0 verfügbar. – Palec

+0

Korrekt. v1.9 gibt es etwa eineinhalb Jahre, als dieses Buch geschrieben wurde. –

+0

Debian hat einen 2-jährigen Veröffentlichungszyklus, und AFAIK ist nicht ungewöhnlich, dass die oldstable-Version in der Produktion verwendet wird. Aus diesem Grund muss ich die Git-Version angeben, in der diese Funktion enthalten ist. – Palec

Verwandte Themen