由于我们内部代码托管的网址更改,我正在编写脚本来更新数百个存储库遥控器。
其中一些存储库具有不同的远程名称(即与源不同)。测试过没有提供远程名称,更新的遥控器可以ping通,但我不了解这种行为。
首选以更明确的方式更新遥控器是首选,我尝试使用bash提取原始名称:
下面的远程名称和地址之间的字符是什么?
$ git remote -v
origin ssh://git@code_hosting_site.com/project_name/repo_name.git (fetch)
^^
感谢您的帮助。
答案 0 :(得分:2)
这是正常的吗?
"正常"是一个有趣的词。很难定义这是否正常。它有一个异常有一个遥控器而没有命名为origin
,但它不是错误,它是'只是奇数。
如果有2个或更多遥控器会怎么样?
这取决于你。 git remote -v
会列出所有这些内容,因此以这种方式提取它们当然是可能的。您也可以使用:
git config --get-regexp 'remote\..*'
列出所有这些内容。您甚至可能希望添加--local
以确保仅列出本地.git/config
文件中定义的远程数据库,以防某些疯狂用户在其全局配置中定义了远程用户。 (我假设您不想尝试更新任何此类条目。)
另请注意,每个遥控器都可以定义URL和推送URL 。这些配置名称不区分大小写,因此您在查找任何remote.remote.url
和remote.remote.pushurl
设置"手动"时应折叠大小写。 (如果您编写自己的代码来阅读config
文件),但在使用git config --get-regexp
或git 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
更改配置旧配置。在实践中,可能不需要它。