在 bash 中从 GitHub 网址提取存储库名称

在 bash 中从 GitHub 网址提取存储库名称

给定任何 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必须适用于上面指定的所有类型的 URL。

谢谢。

答案1

$ 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

答案2

我会选择basename $URL .git

答案3

老帖子,但我最近遇到了同样的问题。

该正则^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+).git$表达式适用于这三种类型的 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)匹配并捕获字符httpsgit
  • (:\/\/|@)匹配并捕获字符://@
  • ([^\/:]+)匹配并捕获一个或多个不属于或/不属于:
  • [\/:]匹配一个字符 /或者:
  • ([^\/:]+)/匹配并捕获一个或多个非或的字符:,再次
  • [\/:]匹配字符/
  • (.+)匹配并捕获一个或多个字符
  • (.git)*匹配.git末尾的可选后缀
  • $匹配字符串的结尾

这远非完美,因为类似的东西[email protected]:some-user/my-repo.git会匹配,但我认为它足以进行提取。

答案4

使用正则表达式:/([^/]+)\.git$/

相关内容