git - 更新遥控器 - 我是否需要提供遥控器名称?

时间:2018-06-13 11:06:46

标签: git git-bash git-remote

由于我们内部代码托管的网址更改,我正在编写脚本来更新数百个存储库遥控器。

其中一些存储库具有不同的远程名称(即与源不同)。测试过没有提供远程名称,更新的遥控器可以ping通,但我不了解这种行为。

  1. 这是不寻常的吗?
  2. 如果有2个或更多遥控器会怎么样?
  3. 首选以更明确的方式更新遥控器是首选,我尝试使用bash提取原始名称:

    下面的远程名称和地址之间的字符是什么?

    $ git remote -v
    origin  ssh://git@code_hosting_site.com/project_name/repo_name.git (fetch)
          ^^
    

    感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

  

这是正常的吗?

"正常"是一个有趣的词。很难定义这是否正常。它有一个异常有一个遥控器而没有命名为origin,但它不是错误,它是'只是奇数

  

如果有2个或更多遥控器会怎么样?

这取决于你。 git remote -v会列出所有这些内容,因此以这种方式提取它们当然是可能的。您也可以使用:

git config --get-regexp 'remote\..*'

列出所有这些内容。您甚至可能希望添加--local以确保仅列出本地.git/config文件中定义的远程数据库,以防某些疯狂用户在其全局配置中定义了远程用户。 (我假设您不想尝试更新任何此类条目。)

另请注意,每个遥控器都可以定义URL和推送URL 。这些配置名称不区分大小写,因此您在查找任何remote.remote.urlremote.remote.pushurl设置"手动"时应折叠大小写。 (如果您编写自己的代码来阅读config文件),但在使用git config --get-regexpgit remote -v进行案例折叠时,您不必担心这一点对你而言。

因此,读取git config --get-regexp输出的sh或bash脚本可能会使用:

# fix - called with URLs that may need fixing. Argument $1 is the
# type (url or pushurl), argument $2 is the remote, $3 is the URL itself.
fix() {
    local urltype=$1 remote="$2" url="$3"
    local newurl

    case $3 in
    ...) newurl="echo $url | sed ...";;
    *) return;;
    esac
    git config "remote.$remote.$urltype" "$newurl"
}

git config --local --get-regexp 'remote\..*' | sort | while read -r lhs rhs; do
    set -- $(echo $lhs | sed 's/\./ /g')
    case $3 in
    url|pushurl) fix $3 "$2" "$rhs";;
    esac
done

(一个人可能在bash中有点发型;上面的工作在POSIX中 - 尽管整个事情都是未经测试的。当然你也需要填写...部分。)

通常,远程名称和URL不应包含空格。我使用上面的引号来处理它们可能的情况。 (git remote命令不允许您添加名称中包含空格的遥控器,但允许在URL中使用空格。)显然无用的使用" sort"是处理极端情况:如果.git/config文件非常大,我们可能会在git config仍在阅读和打印时尝试运行git config --get-regexp 更改配置配置。在实践中,可能不需要它。