使用bash,如何替换git克隆url的域和端口?

使用bash,如何替换git克隆url的域和端口?,bash,git,github,gitlab,Bash,Git,Github,Gitlab,考虑一下环境GITLAB\u CLONE\u URL 我的程序将使用以下内容克隆它: $ myapp clone ${GITLAB_CLONE_URL} 作为提醒,以下是valids git克隆URL: git@github.com:lab/rollup-umd-documentation.git ssh://git@git.gitlab.com:200/deploytools/ssl-gandi.git 我的程序是克隆的,但在某些情况下,它不知道域。它必须包含一个选项,以防无法访

考虑一下环境
GITLAB\u CLONE\u URL

我的程序将使用以下内容克隆它:

$ myapp clone ${GITLAB_CLONE_URL}
作为提醒,以下是valids git克隆URL:

  • git@github.com:lab/rollup-umd-documentation.git
  • ssh://git@git.gitlab.com:200/deploytools/ssl-gandi.git
我的程序是克隆的,但在某些情况下,它不知道域。它必须包含一个选项,以防无法访问域

$ myapp clone ${gitUrl} --force-domain=private
这将克隆以下URL:

  • git@private:lab/rollup-umd-documentation.git
  • ssh://git@私有:200/deploy tools/ssl-gandi.git
请注意,最后一个条目有一个http端口,我还希望有
--force port=32000
,这将使用一个强制端口:

  • git@private:32000/lab/rollup-umd-documentation.git
  • ssh://git@私有:32000/deploy tools/ssl-gandi.git
如何使用bash很好地插入域/端口以生成此结果?

依赖项:

  • GNUBashV4+
  • GNU sed
我不认为git url
git@private:32000/lab/rollup umd文档。git
有效。端口号
32000
与路径混淆。因此,我会像
git@github.com:foo/bar.git
with
ssh://git@github.com/foo/bar.git

脚本
mygit

#!/usr/bin/env bash
set -eu -o pipefail

for param in "$@"; do
    case "$param" in
        --force-domain=*)
            private_domain="${param#*=}"
            ;;
        --force-port=*)
            private_port="${param#*=}"
            ;;
        *://*|*@*/*)
            git_url="$param"
            ;;
    esac
done

declare -a sed_opts=(-e "s,^\\([a-z]\\+\\)@\\([^:]\\+\\):,ssh://\\1@\\2/,")

[[ -n "${private_domain:-}" ]] && sed_opts+=(
        -e "s,//\\(.\\+@\\)\\?[^/:]\\+,//\\1$private_domain,"
    )

[[ -n "${private_port:-}" ]] && sed_opts+=(
        -e "s,//\\(.\\+@\\)\\?\\([^:/]\\+\\)\\(:[0-9]\\+\\)\\?,//\\1\\2:${private_port},"
    )

if [[ -z "${git_url}" ]]; then
    cat <<HELP_MESSAGE
$0 [--force-domain=domain] [--force-port=port] git-repo-url
HELP_MESSAGE
    exit 1
fi

new_git_url="$(echo "$git_url" | sed "${sed_opts[@]}")"

echo "${new_git_url}"
示例:

./mygit git@github.com:lab/rollup-umd-documentation.git --force-domain=private --force-port=32000
依赖项:

  • GNUBashV4+
  • GNU sed
我不认为git url
git@private:32000/lab/rollup umd文档。git
有效。端口号
32000
与路径混淆。因此,我会像
git@github.com:foo/bar.git
with
ssh://git@github.com/foo/bar.git

脚本
mygit

#!/usr/bin/env bash
set -eu -o pipefail

for param in "$@"; do
    case "$param" in
        --force-domain=*)
            private_domain="${param#*=}"
            ;;
        --force-port=*)
            private_port="${param#*=}"
            ;;
        *://*|*@*/*)
            git_url="$param"
            ;;
    esac
done

declare -a sed_opts=(-e "s,^\\([a-z]\\+\\)@\\([^:]\\+\\):,ssh://\\1@\\2/,")

[[ -n "${private_domain:-}" ]] && sed_opts+=(
        -e "s,//\\(.\\+@\\)\\?[^/:]\\+,//\\1$private_domain,"
    )

[[ -n "${private_port:-}" ]] && sed_opts+=(
        -e "s,//\\(.\\+@\\)\\?\\([^:/]\\+\\)\\(:[0-9]\\+\\)\\?,//\\1\\2:${private_port},"
    )

if [[ -z "${git_url}" ]]; then
    cat <<HELP_MESSAGE
$0 [--force-domain=domain] [--force-port=port] git-repo-url
HELP_MESSAGE
    exit 1
fi

new_git_url="$(echo "$git_url" | sed "${sed_opts[@]}")"

echo "${new_git_url}"
示例:

./mygit git@github.com:lab/rollup-umd-documentation.git --force-domain=private --force-port=32000

修好了。粘贴代码时可能是我的胖手指。你应该小心使用它们。再次感谢。是的,我使用shellcheck,否则我无法测试此脚本。修复了它。粘贴代码时可能是我的胖手指。你应该小心使用它们。再次感谢。是的,我使用shellcheck,否则我无法测试此脚本。
./mygit git@github.com:lab/rollup-umd-documentation.git --force-domain=private
ssh://git@private/lab/rollup-umd-documentation.git
./mygit --force-domain=private --force-port=32000 \
       https://github.com:31000/deploy-tools/ssl-gandi-gitlab.git
https://private:32000/deploy-tools/ssl-gandi-gitlab.git