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.

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

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


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="git@github.com: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 https@github.com: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.


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}}")"


0
basename $git_repo_url | tr -d ".git"

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([^.]+)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.