Extrahieren Sie den Repository-Namen aus der GitHub-URL in Bash

8

Gegeben JEDE GitHub-Repository-URL-Zeichenfolge wie:

git://github.com/some-user/my-repo.git

oder

git@github.com:some-user/my-repo.git

oder

https://github.com/some-user/my-repo.git

Wie kann bashder Repository-Name am besten my-repoaus einer der folgenden Zeichenfolgen extrahiert werden ? Die Lösung MUSS für alle oben angegebenen Arten von URLs funktionieren.

Vielen Dank.

Justin
quelle

Antworten:

17
$ url=git://github.com/some-user/my-repo.git
$ basename=$(basename $url)
$ echo $basename
my-repo.git
$ filename=${basename%.*}
$ echo $filename
my-repo
$ extension=${basename##*.}
$ echo $extension
git
Quanten
quelle
Danke, ich versuche es zu einem Einzeiler zu machen, aber es funktioniert nicht. REPO_NAME = $ {`Basisname $ REPO_URL`%. *}
Justin
1
echo $(basename "$url" ".${url##*.}").
Quanten
+1. Gibt es etwas Ähnliches, um den Hostnamen zu erhalten , z. B. github.com, stattdessen @quanta?
Chepukha
12

Ich würde mitgehen basename $URL .git.

womble
quelle
die beste Antwort. Das kürzeste auch
Andrey Regentov
8

Alter Beitrag, aber ich hatte kürzlich das gleiche Problem.

Die Regex ^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+).git$funktioniert für die drei Arten von URLs.

#!/bin/bash

# url="git://github.com/some-user/my-repo.git"
# url="https://github.com/some-user/my-repo.git"
url="[email protected]:some-user/my-repo.git"

re="^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+).git$"

if [[ $url =~ $re ]]; then    
    protocol=${BASH_REMATCH[1]}
    separator=${BASH_REMATCH[2]}
    hostname=${BASH_REMATCH[3]}
    user=${BASH_REMATCH[4]}
    repo=${BASH_REMATCH[5]}
fi

Erklärung ( siehe in Aktion auf Regex101 ):

  • ^ entspricht dem Anfang einer Zeichenfolge
  • (https|git)passt und erfasst die Zeichen httpsodergit
  • (:\/\/|@)passt und erfasst die Zeichen ://oder@
  • ([^\/:]+)stimmt mit einem oder mehreren Zeichen überein und erfasst diese, die weder /noch sind:
  • [\/:]entspricht einem Zeichen, das / oder ist:
  • ([^\/:]+)Stimmt mit einem oder mehreren Charakteren überein und erfasst diese, die /noch :nicht vorhanden sind
  • [\/:] passt zum Charakter /
  • (.+) stimmt mit einem oder mehreren Zeichen überein und erfasst diese
  • .gitStreichhölzer ... .gitim wahrsten Sinne des Wortes
  • $ entspricht dem Ende einer Zeichenfolge

Dies ist [email protected]:some-user/my-repo.gitalles andere als perfekt, da so etwas passen würde, aber ich denke, es ist gut genug für die Extraktion.

Hicham
quelle
Das ist Gold!
Omri
Einige URLs haben .gitam Ende keine .
Kenn
5

Zusammenfassen:

  • URL ohne (optionales) Suffix abrufen:

    url_without_suffix="${url%.*}"
  • Repository-Namen abrufen:

    reponame="$(basename "${url_without_suffix}")"
  • Holen Sie sich anschließend den Namen des Benutzers (Hosts):

    hostname="$(basename "${url_without_suffix%/${reponame}}")"
Hypnoglow
quelle
0

Verwenden Sie den regulären Ausdruck: /([^/]+)\.git$/

Aaron Shen
quelle
0
basename $git_repo_url | tr -d ".git"
jit
quelle
0

Basisname ist mein Favorit, aber Sie können auch verwenden sed:

url=git://github.com/some-user/my-repo.git
reponame="$(echo $url | sed -r 's/.+\/([^.]+)(\.git)?/\1/')"
# reponame = "my-repo"

"sed" löscht den gesamten Text bis zum letzten /+ der .gitErweiterung (falls vorhanden) und behält die Übereinstimmung der Gruppe bei, \1die alles außer Punkt ist([^.]+)

Noam Manos
quelle