Mein Team wechselt zwischen der Verwendung von dev und master als Standard-Zweig für mehrere Repos und ich möchte ein Skript schreiben, das beim Betreten eines Verzeichnisses nach dem Standard-Zweig sucht.
Wenn Pull-Requests in einigen dieser Repos geöffnet werden, sind sie standardmäßig entweder „dev“ oder „master“ als Zusammenführungsziel.
Ist ein Git-Befehl verfügbar, um den Standardzweig für das Remote-Repository zu bestimmen?
Der Standard-Zweig ist ein Github-Ding, kein Git-Ding.
– Ismail Badawi
23. Februar 2015 um 3:10 Uhr
Sie können die GitHub-API wie in dieser Frage verwenden: stackoverflow.com/questions/16500461/…
– Ismail Badawi
23. Februar 2015 um 3:15 Uhr
@IsmailBadawi Wirklich? Wenn Sie ein lokales Bare-Repo erstellen und darauf einen Klon ausführen, muss es immer noch eine Logik geben, die bestimmt, welcher Zweig standardmäßig ausgecheckt wird, oder?
– bluenote10
16. Juli 2019 um 7:33 Uhr
Keine der folgenden Lösungen funktioniert zuverlässig für mich: wenn ich in der Branche bin featuregegabelt von developes wird mich zurückbringen develop und nicht master (oder mainaus denen develop ist eine Gabel) … Irgendwelche Hilfe?
– Benutzer3341592
12. Januar 2021 um 16:02 Uhr
Frage gestellt in stackoverflow.com/questions/65703168/…
– Benutzer3341592
13. Januar 2021 um 13:42 Uhr
Radon8472
Ich habe einen Weg gefunden, den Standardzweig zu erkennen, wenn er nicht Master ist.
git remote show [your_remote] | sed -n '/HEAD branch/s/.*: //p'
Ich habe es mit mehreren Repos von Gitlab getestet und es hat gut funktioniert. (für die meisten Situationen [your_remote] wird sein originLauf git remote um den Namen Ihrer Fernbedienung zu überprüfen)
Das hat bei mir gut funktioniert, außer dass der Cut-Befehl ein Leerzeichen vor dem eigentlichen Branch-Namen lässt, was bei der Verwendung aus Skripten zu Problemen führen kann. Am Ende habe ich verwendet git remote show upstream | grep "HEAD branch" | sed 's/.*: //'
– JHH
9. Oktober 2018 um 12:01 Uhr
Beste Methode bisher. Ich habe aus irgendwelchen Gründen nicht einmal refs/remotes/origin/HEAD.
– Loïc Faure-Lacroix
11. Oktober 2018 um 16:08 Uhr
Ich habe es so aktualisiert, um das Leerzeichen zu entfernen git remote show origin | grep 'HEAD branch' | cut -d' ' -f5
– Andreas
20. September 2019 um 16:56 Uhr
Beachten Sie, dass dies für einige (ältere) Versionen von Git möglicherweise nicht funktioniert, vorausgesetzt, Sie haben einen mehrdeutigen HEAD. Siehe zB diesen Beitrag
– David Střelák
27. September 2019 um 9:53 Uhr
Dies funktioniert nicht, wenn git unter einem nicht-englischen Gebietsschema ausgeführt wird. Zum Beispiel mit einem deutschen Gebietsschema HEAD branch buchstabiert ist Hauptbranch. Um dies zu beheben, verwenden Sie: LC_ALL=C git remote show origin | sed -n '/HEAD branch/s/.*: //p'
– Slaven Rezic
23. März 2022 um 16:15 Uhr
Danielkza
Getestet mit Git 2.9.4 (funktioniert aber möglicherweise in anderen Versionen) in einem von Github geklonten Repo:
git symbolic-ref refs/remotes/origin/HEAD | sed '[email protected]^refs/remotes/origin/@@'
Beispielausgabe:
master
Wenn ich den Standardzweig auf der Serverseite (Github) ändere, erhält dies immer noch den alten Standard in einem alten, aber ansonsten aktuellen Klon (aber frische Klone sind in Ordnung). Wie erzwingt man hier ein Update?
– nö
5. April 2018 um 15:20 Uhr
Vielleicht mache ich etwas falsch, aber wenn ich das ausführe, bekomme ich: fatal: ref refs/remotes/origin/HEAD is not a symbolic ref mit Git 2.19.1.
– Christianbundy
2. November 2018 um 17:03 Uhr
Diese Methode kann fehlschlagen oder falsche Ergebnisse zurückgeben. Die Referenz kann eher ein Hash sein, der nicht in eine Verzweigung aufgelöst werden kann, als eine symbolische Referenz. Dies kann auch durch Betrachten von HEAD gelöst werden. Trotzdem habe ich in 6528 Repositories die beiden überprüft git symbolic-ref Methoden liefern falsche Ergebnisse (z master eher, als develop Pro Alfresco/chef-alfresco) in 172 Fällen. Die git remote show Die von @ Radon8472 vorgeschlagene Methode ist zuverlässiger und scheint in einigen der 172 abweichenden Fälle, die ich von Hand überprüft habe, das richtige Ergebnis zurückzugeben.
– Diomidis spinellis
25. Januar 2019 um 15:20 Uhr
Sie können auch verwenden Basisname statt sed basename $(git symbolic-ref refs/remotes/origin/HEAD)
– OzzyCzech
26. März 2019 um 11:20 Uhr
Um diese symbolische Referenz vom Upstream zu synchronisieren, git remote set-head origin --auto. Dies aktualisiert sowohl das, was in gesehen wird git remote show und die symbolische Referenz, auf die hier verwiesen wird.
– Eduard Anderson
14. Januar 2020 um 14:46 Uhr
git rev-parse --abbrev-ref origin/HEAD wird drucken origin/<default-branch-name>. Die git symbolic-ref Antworten machen das Gleiche, brauchen aber eine längere Argumentation.
Wenn die origin Das Repository ändert dann seinen Standard-Zweignamen git remote set-head origin -a ruft den neuen Standard-Zweignamen ab.
Dies läuft viel schneller als git remote show, weil es lokale Informationen verwendet, ohne die Gegenstelle abzufragen. Sie können die ersten 7 Zeichen (zB “origin/”) abschneiden und erhalten nur den Zweignamen mit git rev-parse --abbrev-ref origin/HEAD | cut -c8-.
– Scottlocke
15. Juni 2021 um 0:20 Uhr
Ist dies nicht eigentlich die kanonische Antwort, da sie einen Installationsbefehl verwendet und keine Dienstprogramme außerhalb von Git selbst benötigt?
– Andreas Spencer
18. Juni 2021 um 11:47 Uhr
Mir selbst antworten – dies ist NICHT die kanonische Antwort, da sie nur in einem Repo funktioniert, das durch Klonen von der Fernbedienung erstellt wurde – nicht von einem Repo, das Sie erstellt und dann die Fernbedienung hinzugefügt haben git remote add und dazu geschoben.
– Andreas Spencer
18. Juni 2021 um 11:52 Uhr
(Ich stimme immer noch hoch, da dies die beste Antwort im wahrscheinlichen Anwendungsfall eines Skripts ist, bei dem Sie wissen, dass Sie das Repo von einer Fernbedienung geklont haben.)
– Andreas Spencer
18. Juni 2021 um 11:54 Uhr
Funktioniert bei mir nicht: Wenn ich wie in der Antwort ausgeführt werde, bekomme ich nur stdout origin/HEADund es gibt auch Fehler warning: ignoring dangling symref refs/remotes/origin/HEAD, fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.. Wenn ich an den Befehl a anhänge -- .es sagt warning: ignoring dangling symref refs/remotes/origin/HEAD, fatal: bad revision 'origin/HEAD'. Allerdings ist die git symbolic-ref Antwort Diese Antwort bezieht sich auf Werke für mich.
– Hallo Engel
8. August 2021 um 14:42 Uhr
Diese Frage ist etwas alt, aber falls jemand in letzter Zeit darauf stößt …
git remote show <remote_name> | awk '/HEAD branch/ {print $NF}'
Dadurch wird auch nur der Zweigname angezeigt, ohne Leerzeichen oder anderen Unsinn.
Ich speichere dies gerne mit ein paar Git-Aliassen (ich habe eine Reihe nützlicher Aliase wie diese):
Ich verwende “upstream” und “origin” fast 100% der Zeit als meine Fernbedienungen (“upstream”, wenn ich mit a Fork & Pull Workflow … was oft der Fall ist). Ihr Anwendungsfall benötigt die möglicherweise nicht upstream-name Alias, ich finde es nur nützlich.
Bisher scheint es keine Antwort zu geben, die kein Klonen erfordert
Dies erfordert git 2.8.0 oder neuer
$ git ls-remote --symref [email protected]:pre-commit/pre-commit.github.io HEAD
ref: refs/heads/real_master HEAD
e100a6a3c72b4e54f0d176f791dfd2dbd7eb5fa7 HEAD
Danke für eine nette Antwort. Ich habe awk hinzugefügt, um den Zweignamen zu übernehmen: git ls-remote --symref https://github.com/hnakamur/ltsvlog HEAD | awk '/^ref:/ {sub(/refs\/heads\//, "", $2); print $2}'
– hnakamur
27. Juli 2020 um 9:02 Uhr
Das ist eine nette Antwort, aber sie gibt Ihnen nur den aktuellen HEAD der Fernbedienung und keine Informationen darüber, welcher der Standardzweig ist.
– Radon8472
21. September 2022 um 8:00 Uhr
real_master Hier ist der Standardzweig
– Antony Sottile
21. September 2022 um 12:41 Uhr
lsl
Da ist ein –kurz Option zu git symbolisch-ref. Also mein bevorzugter Befehl:
Danke für eine nette Antwort. Ich habe awk hinzugefügt, um den Zweignamen zu übernehmen: git ls-remote --symref https://github.com/hnakamur/ltsvlog HEAD | awk '/^ref:/ {sub(/refs\/heads\//, "", $2); print $2}'
– hnakamur
27. Juli 2020 um 9:02 Uhr
Das ist eine nette Antwort, aber sie gibt Ihnen nur den aktuellen HEAD der Fernbedienung und keine Informationen darüber, welcher der Standardzweig ist.
– Radon8472
21. September 2022 um 8:00 Uhr
real_master Hier ist der Standardzweig
– Antony Sottile
21. September 2022 um 12:41 Uhr
Der folgende Befehl listet den HEAD-Zweig auf, unabhängig davon, wie Sie Ihre Fernbedienungen benannt haben:
git branch --remotes --list '*/HEAD'
Daraus können Sie den Standardzweig wie folgt extrahieren:
git branch -rl '*/HEAD' | rev | cut -d/ -f1 | rev
(unter Verwendung kurzer Varianten der git branch Argumente).
Wenn Ihre Shell das nicht hat rev Befehl können Sie verwenden awk stattdessen:
git branch -rl '*/HEAD' | awk -F/ '{print $NF}'
Ich arbeite irgendwo, dass stage wird als Stamm für die Entwicklung verwendet, und master wird für die Bereitstellung verwendet. Das gibt mir stagedas wollte ich – danke!
– Rattenfänger
27. Mai 2021 um 18:39 Uhr
Gibt für mich bash: rev: command not found und fatal: -a and -r options to 'git branch' do not make sense with a branch name
– Radon8472
21. September 2022 um 7:51 Uhr
@ Radon8472 Wenn Ihre Shell das nicht hat rev Befehl können Sie verwenden awk stattdessen: git branch -rl '*/HEAD' | awk -F/ '{print $NF}'
– Henry
22. September 2022 um 12:15 Uhr
@Henry das gibt fatal: -a and -r options to 'git branch' do not make sense with a branch name
– Radon8472
24. September 2022 um 6:31 Uhr
@ Radon8472 Woher kommt das -a Option kommen? Was erhalten Sie, wenn Sie nur den ersten Befehl ausführen: git branch -rl '*/HEAD' ?
– Henry
25. September 2022 um 23:02 Uhr
14410300cookie-checkWie bekomme ich den Standard-Git-Branch?yes
Der Standard-Zweig ist ein Github-Ding, kein Git-Ding.
– Ismail Badawi
23. Februar 2015 um 3:10 Uhr
Sie können die GitHub-API wie in dieser Frage verwenden: stackoverflow.com/questions/16500461/…
– Ismail Badawi
23. Februar 2015 um 3:15 Uhr
@IsmailBadawi Wirklich? Wenn Sie ein lokales Bare-Repo erstellen und darauf einen Klon ausführen, muss es immer noch eine Logik geben, die bestimmt, welcher Zweig standardmäßig ausgecheckt wird, oder?
– bluenote10
16. Juli 2019 um 7:33 Uhr
Keine der folgenden Lösungen funktioniert zuverlässig für mich: wenn ich in der Branche bin
feature
gegabelt vondevelop
es wird mich zurückbringendevelop
und nichtmaster
(odermain
aus denendevelop
ist eine Gabel) … Irgendwelche Hilfe?– Benutzer3341592
12. Januar 2021 um 16:02 Uhr
Frage gestellt in stackoverflow.com/questions/65703168/…
– Benutzer3341592
13. Januar 2021 um 13:42 Uhr