Ich muss eine Teilbaumzusammenführung für einen bestimmten Zweig durchführen, wenn dieser in einem bestimmten Remote-Repository vorhanden ist. Das Problem ist, dass das Remote-Repository nicht lokal ausgecheckt ist, sodass ich es nicht verwenden kann git branch -r
. Ich habe nur eine entfernte Adresse, so etwas https://github.com/project-name/project-name.git
. Gibt es eine Möglichkeit, entfernte Zweige nur anhand einer entfernten Adresse aufzulisten? Ich konnte nichts Nützliches finden :(
105
git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/null
gefolgt vonif [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi
/refs/heads/branch-name
. Andernfallsfoo/branch-name
würde die Verzweigung zurückgegeben, auch wenn keine vorhanden istbranch-name
.git ls-remote --heads origin branch-name
quelle
git ls-remote --exit-code . origin/branch-name &> /dev/null
dann$?
als Testoperand verwendetif git ls-remote ...; then ...; fi
weniger fehleranfällig als die Überprüfung$?
(die durch Protokollieren von Anweisungen, Traps usw. geändert werden kann).--heads
?--heads
listet nur Zweige auf. Verwenden Sie--tags
diese Option, um nur Tags aufzulisten.Eine andere Möglichkeit, die Sie im aktuellen Ordner verwenden können, wenn es sich um ein Git-Repo handelt , das ausgeführt werden soll
quelle
git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
git branch -a | grep "\b${BRANCH}$"
git fetch
ist erforderlich, wenn bei dieser Verwendunggit branch -a
alle Fernbedienungsreferenzen zuerst abgerufen werden. Andernfalls verwenden Sie,git ls-remote
wie von anderen angegeben.git branch -a --list '<pattern>'
ist auch eine Option. Pipe to grep, wenn Sie einen Rückkehrcode für Ihr Skript benötigen.Sie können auch Folgendes verwenden:
gibt das letzte Commit und den Wert von $ zurück? ist 0, sonst wird "fatal: bad sha1 reference remotes / origin / <>" und der Wert von $ zurückgegeben? ist 128
quelle
Dann müssen Sie den Repository-Namen nicht jedes Mal manuell übergeben.
Anstatt
Beispiel:
ODER
Beide geben die gleiche Ausgabe:
Mehr zu Origin : Git hat das Konzept von "Fernbedienungen", bei denen es sich einfach um URLs zu anderen Kopien Ihres Repositorys handelt. Wenn Sie ein anderes Repository klonen, erstellt Git automatisch eine Fernbedienung mit dem Namen "origin" und zeigt darauf. Sie können weitere Informationen zur Fernbedienung anzeigen, indem Sie git remote show origin eingeben.
quelle
Alle Antworten hier sind Linux-Shell-spezifisch, was nicht sehr hilfreich ist, wenn Sie sich in einer Umgebung befinden, die diese Art von Vorgängen nicht unterstützt - beispielsweise die Windows-Eingabeaufforderung.
Akzeptiert glücklicherweise
git ls-remote
ein--exit-code
Argument, das 0 oder 2 zurückgibt, je nachdem, ob der Zweig existiert oder nicht. So:git ls-remote --exit-code --heads origin <branch-that-exists-in-origin>
gibt 0 zurück und
git ls-remote --exit-code --heads origin <branch-that-only-exists-locally>
wird 2 zurückgeben.
Für PowerShell können Sie einfach die integrierte Semantik für den Umgang mit Wahrhaftigkeit verwenden:
if (git ls-remote --heads origin <branch-that-exists-in-origin>) { $true } else { $false }
ergibt
$true
, während:if (git ls-remote --heads origin <branch-that-only-exists-locally>) { $true } else { $false }
ergibt
$false
.quelle
Sie können so etwas im Bash-Terminal tun. Ersetzen Sie einfach die Echos durch die Befehle, die Sie ausführen möchten.
Ich hoffe es hilft.
quelle
funktioniert die meiste Zeit.
Funktioniert aber nicht, wenn der Zweig teilweise wie unten übereinstimmt.
Verwenden
wenn Sie einen zuverlässigen Weg wollen.
Wenn Sie in Skript verwenden möchten und nicht
origin
als Standardfernbedienung annehmen möchten, dannsollte arbeiten.
Beachten Sie, dass dies
git branch -a | grep ...
nicht zuverlässig ist, da es eine Weile dauern kann, bis der letzte ausgeführtfetch
wurde.quelle
grep -x "$branch"
ist identisch mitgrep ^"$branch"$
). Obwohl ich in Skripten die Langformschalter bevorzuge :--line-regexp
. Es besteht auch keine Notwendigkeit zu tunwc -l
. Wenn Sie eine leere Ausgabe in einen Bash einfügen, wird diesif [ -z ]
effektiv als wahr ausgewertet. Dies bedeutet, dass der Zweig nicht vorhanden ist. Das spart Ihnen einige Millisekunden.Sie können das Repository hinzufügen, das Sie als Remote verwenden,
git remote add something https://github.com/project-name/project-name.git
und dann a ausführengit remote show something
, um alle Informationen über die Remote abzurufen. Dies erfordert eine Netzwerkverbindung und ist für den menschlichen Gebrauch nützlich.Alternativ können Sie a
git fetch something
. Dadurch werden alle Zweige auf der aufgerufenen Fernbedienung abgerufensomething
und in Ihrem lokalen Repository gespeichert. Sie können sie dann nach Belieben in Ihrer lokalen Niederlassung zusammenführen. Ich empfehle diesen Weg da , wenn Sie schließlich entscheiden , dass Sie haben zu verschmelzen, das ist , was Sie tun müssen.OT: Ihre Verwendung von "lokal ausgecheckt" zeigt an, dass Sie dies vom Standpunkt eines zentralisierten Versionskontrollsystems aus betrachten. Das ist normalerweise eine Sackgasse, wenn Sie mit Git zu tun haben. Es werden Wörter wie "Kasse" usw. anders verwendet als bei älteren Systemen.
quelle
Du kannst es versuchen
Hier
@{u}
bezieht sich auf Remote / Upstream und@{0}
bezieht sich auf den aktuellen lokalen HEAD (mit neuerer Version von Git,@{0}
kann gekürzt werden als@
). Wenn die Fernbedienung nicht vorhanden ist, tritt ein Fehler auf.Mit Git 2.16.2 (ich bin nicht sicher, welche Version diese Funktionalität als erste hat, z. B. Git 1.7.1 hat sie nicht) können Sie dies tun
Wenn ein Remote-Zweig vorhanden ist, wird eine Ausgabe wie z
Ansonsten erfolgt keine Ausgabe.
quelle
Gibt alle Zweige (remote oder lokal) zurück, die die Abfrage im Namen enthalten.
git branch --all | grep <query>
quelle
Wenn Ihre Filialnamen sehr spezifisch sind, müssen Sie grep möglicherweise nicht für die einfache Übereinstimmung von Filialnamen verwenden:
was funktioniert für
Wir verwenden eine eindeutige Issue-ID als Filialnamen und es funktioniert einwandfrei.
quelle
Ich habe es gerade versucht:
Dies gibt 1 zurück, wenn der Zweig "Ihr Zweig" gefunden wird, andernfalls 0.
quelle
Ich kombiniere einige der obigen Antworten in einem Skript:
Dieses Skript ruft 4 Zweige von einem Remote-Bitbucket ab und überträgt sie an einen Remote-Github. Anschließend werden alle Tags an Github gesendet. Ich verwende dies in einem Jenkins-Job. Deshalb sehen Sie keine
git fetch
odergit pull
, die bereits in der Jenkins-Job-Repository-Konfiguration ausgeführt werden.Normalerweise bevorzuge ich Langformoptionen in Skripten. Ich hätte kombinieren
git branch
undgit checkout
verwenden könnengit checkout -B
.quelle