web-dev-qa-db-ja.com

bashのGitHub URLからリポジトリ名を抽出する

次のようなGitHubリポジトリのURL文字列を指定します。

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

または

[email protected]:some-user/my-repo.git

または

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

bashでリポジトリ名を抽出するための最良の方法は何ですかmy-repo次の文字列のどれから?ソリューション[〜#〜] must [〜#〜]は、上記で指定されたすべてのタイプのURLで機能します。

ありがとう。

8
Justin
$ 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
16
quanta

basename $URL .git

10
womble

古い投稿ですが、最近同じ問題に直面しました。

正規表現^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+).git$は、3種類のURLで機能します。

#!/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

説明( regex101のアクションを参照 ):

  • ^は文字列の先頭に一致します
  • (https|git)は、文字httpsまたはgitに一致してキャプチャします
  • (:\/\/|@)は、文字://または@に一致してキャプチャします
  • ([^\/:]+)は、/でも:でもない1文字以上に一致してキャプチャします
  • [\/:]は、isである1文字と一致します/または:
  • ([^\/:]+)は、/でも:でもない1つ以上の文字と一致し、それでもキャプチャします
  • [\/:]は文字/に一致します
  • (.+)は1文字以上に一致してキャプチャします
  • .git一致....git、文字通り
  • $は文字列の末尾に一致します

[email protected]:some-user/my-repo.gitのようなものが一致するので、これは完全とは程遠いですが、抽出には十分だと思います。

8
Hicham

要約:

  • (オプションの)サフィックスのないURLを取得します:

    url_without_suffix="${url%.*}"
    
  • リポジトリ名を取得:

    reponame="$(basename "${url_without_suffix}")"
    
  • 後でユーザー(ホスト)名を取得します。

    hostname="$(basename "${url_without_suffix%/${reponame}}")"
    
5
hypnoglow
basename $git_repo_url | tr -d ".git"
0
jit

正規表現を使用:/([^/]+)\.git$/

0
Aaron Shen

basenameは私のお気に入りですが、sedを使用することもできます。

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

「sed」は、最後の/ + .git拡張子(存在する場合)まですべてのテキストを削除し、ドット\1を除くすべてのグループ([^.]+)の一致を保持します

0
Noam Manos