Wie erhalte ich SHA des neuesten Commits aus dem Remote-Git-Repository?

73

Weiß jemand, wie man die neueste SHA eines bestimmten Zweigs von außerhalb eines Git-Repositorys erhält ?

Wenn Sie sich in einem Git-Repository befinden, können Sie Folgendes tun:

git log origin/branch_X | head -1

Ich bin jedoch nicht in einem Git-Repository und möchte vermeiden, dass ich in cloneein Repository muss, um die neueste SHA eines Tags / Zweigs zu erhalten. Gibt es eine clevere Möglichkeit, dies zu tun?

AdvilUser
quelle
Haben Sie Dateisystemzugriff auf das Repository, das Sie abfragen möchten?
Greg Hewgill
3
Der richtige Weg, dies zu tun, ist "git rev-parse origin / branch_X" oder "git rev-parse refs / remotes / origin / branch_X", nicht git-log
Jakub Narębski

Antworten:

74

Wenn Sie SHA-1 eines bestimmten Zweigs im Remote-Repository überprüfen möchten, ist Ihre Antwort richtig:

$ git ls-remote <URL>

Wenn Sie sich jedoch im selben Dateisystem befinden, wäre eine einfachere Lösung (ohne dass SHA-1 aus der Ausgabe extrahiert werden muss) einfach:

$ git --git-dir=/path/to/repo/.git rev-parse origin/branch_X

In der Manpage zu git (1) finden Sie eine Beschreibung der --git-dirOption ' '.

Jakub Narębski
quelle
102

Verwenden Sie rev-parse

git rev-parse origin/master # to get the latest commit on the remote

git rev-parse HEAD          # to get the latest commit on the local 
gprasant
quelle
1
+1 Am nützlichsten zusammen mit dem Anhängen von | Clip, um den Sha in die Zwischenablage (Fenster) zu legen.
Darren Lewis
1
git rev-parse HEADGibt das letzte Commit in der lokalen Kopie zurück, während git rev-parse origin/masterdas letzte Commit auf Remote zurückgegeben wird. Dies wurde hier abgefragt. Dies ist meine Lieblingsantwort, auch wenn der erste Befehl entfernt werden sollte.
Fedelibre
2
In der Frage heißt es: "Ich möchte vermeiden, dass ein Repository geklont werden muss, um die neueste SHA eines Tags / Zweigs zu erhalten." Ist es möglich, git rev-parsegegen ein Repository zu verwenden, für das Sie lokal keine Informationen haben?
Nick Chammas
14
Ich denke, git rev-parse origin / master gibt nur dann die richtige Antwort zurück, wenn Ihr lokales Repo auf dem neuesten Stand ist. Um dies zu beweisen, trennen Sie sich vom Internet und probieren Sie es aus. Der Befehl wird erfolgreich sein. Im Gegensatz dazu schlägt git ls-remote fehl, weil versucht wird, das Remote-Repo zu kontaktieren.
Andy Stewart
4
Nein, git fetch origin; git rev-parse origin/masterist der Abruf nicht extrem wichtig?
Alexander Mills
41

Ein Kollege von mir hat das für mich beantwortet:

git ls-remote ssh://git.dev.pages/opt/git/repos/dev.git <branch>
AdvilUser
quelle
3
Vielen Dank. Dies sollte als Antwort auf diese Frage aktualisiert werden.
Abhijeet
19

Verwenden einer Git-URL:

$ git ls-remote <URL> | head -1 | sed "s/HEAD//"

Verwenden eines Verzeichnisses auf einem zugänglichen System:

$ git --git-dir=/path/to/repo/.git rev-parse origin/<targeted-banch>
dch4pm4n
quelle
1
Verwenden Sie sed "s/\tHEAD//"diese Option, um auch die nachfolgende Registerkarte zu entfernen.
Perseiden
3
Warum nicht benutzen | awk '{ print $1 }'?
Devxoul
14

Dies sollte den Trick tun git ls-remote REMOTE | awk "/BRANCH/ {print \$1}"

Ersetzen Sie REMOTE durch den Namen des Remote-Repositorys und BRANCH durch den Namen des Zweigs.

antonagestam
quelle
13

Wie in den obigen Kommentaren erwähnt, sollte dies die beste Lösung sein:

$ git ls-remote <URL> | head -1 | cut -f 1

kitingChris
quelle
1
Dies ist die einzige Option, die (für mich) funktioniert hat, um das Commit von einer Upstream-Fernbedienung in einem gespaltenen Repo abzurufen.
Jalakoo
4

Wenn Sie nur den SHA-1 aus dem aktuell ausgecheckten Zweig Ihres lokalen Repos möchten, können Sie einfach HEAD anstelle von origin / branch_X angeben:

git --git-dir=/path/to/repo/.git rev-parse --verify HEAD


quelle
4

Hier ist eine Copy-Paste-Lösung, die im Repository funktioniert.

origin_head=$(git ls-remote --heads $(git config --get remote.origin.url) | grep "refs/heads/master" | cut -f 1)
if [ $origin_head != "$(git rev-parse HEAD)" ]; then
    echo >&2 "HEAD and origin/master differ."
    exit 1
fi
Skensell
quelle
1
Ich würde es empfehlen grep "refs/heads/master$", wenn jemand nach anderen Zweigen als master oder einem master2-Zweig fragen könnte, könnte dies brechen;)
kitingChris
2

Verweise auf Zweigköpfe werden im .git/refs/Baum gespeichert . Sie sollten also in der Lage sein, den Hash des neuesten Commits unter folgender Adresse zu finden:

cat .git/refs/remotes/origin/branch_X

Ihr Weg kann leicht abweichen.

Greg Hewgill
quelle
1
Das würde nicht funktionieren, wenn Sie Schiedsrichter gepackt haben. Dann müssen Sie einen Blick auf .git /
Packed
Diese Lösung ist anfällig für zukünftige Änderungen im Git-On-Disk-Repository-Format.
Greg Hewgill
0

Ich empfehle, Informationen abzurufen, die sich nur auf einen bestimmten Zweig beziehen, und dann zu analysieren, um die neuesten Informationen zu erhalten:
git ls-remote <url> --tags <branch_name> | awk '{print $1;}'

Anamar
quelle