Linux 将系统上所有git存储库的远程地址从http更改为ssh
最近Github发布了一个弃用通知,指出推送到存储库的HTTP方法即将过期。我决定改为SSH方法。在这样做时,我发现我们需要在设置密钥后更改repo的远程URL 但是更改是一个乏味的过程,要对本地系统中的所有存储库进行更改是一项相当长的工作。我们是否可以编写一个Bash脚本,逐个遍历目录,然后将远程URL从HTTP版本更改为SSH版本 这对HTTP->SSH进行了必要的更改Linux 将系统上所有git存储库的远程地址从http更改为ssh,linux,bash,git,ssh,windows-subsystem-for-linux,Linux,Bash,Git,Ssh,Windows Subsystem For Linux,最近Github发布了一个弃用通知,指出推送到存储库的HTTP方法即将过期。我决定改为SSH方法。在这样做时,我发现我们需要在设置密钥后更改repo的远程URL 但是更改是一个乏味的过程,要对本地系统中的所有存储库进行更改是一项相当长的工作。我们是否可以编写一个Bash脚本,逐个遍历目录,然后将远程URL从HTTP版本更改为SSH版本 这对HTTP->SSH进行了必要的更改 git remote set-url origin git@github.com:username/repo-name
git remote set-url origin git@github.com:username/repo-name
我们需要更改的是repo名称
,它可以与目录名相同
我考虑的是在包含所有git repo的父目录上运行嵌套的for循环。这将类似于:
for DIR in *; do
for SUBDIR in DIR; do
("git remote set-url..."; cd ..;)
done
done
这将识别包含一个文件或文件夹的所有子文件夹,名为<代码> .git < /代码>,将其视为一个回购,并运行您的命令。< /P> 我强烈建议您在运行之前进行备份。
#/bin/bash
用户名=“您的用户名”
对于以美元表示的目录(查找。-类型d);做
如果[-d“$DIR/.git”]| |[-f“$DIR/.git”];然后
#使用(and)创建子shell,这样工作目录就不会
#主脚本中的更改
#地下室启动
(
cd“$DIR”
REMOTE=$(git配置--获取REMOTE.origin.url)
REPO=$(basename`git rev parse--show top level`)
如果[[“$REMOTE”=”https://github.com/“*]];然后
echo“找到HTTPS回购($repo)$DIR”
git远程设置url源git@github.com:$USERNAME/$REPO
#检查转换是否有效
REMOTE=$(git配置--获取REMOTE.origin.url)
如果[[“$REMOTE”=”git@github.com:“*]”;然后
echo“Repo\”$Repo\“已成功转换!”
其他的
echo“无法将repo$repo从HTTPS转换为SSH”
fi
elif[“$REMOTE”=”git@github.com:“*]”;然后
echo“SSH repo-skip($repo)$DIR”
其他的
echo“非Github-跳过($REPO)$DIR”
fi
)
#底壳端
fi
完成
这是一个很好的起点。一些建议:最好只在Github存储库上这样做。理想情况下,它将迭代所有远程,而不是硬代码源代码,并跳过非Github和非http远程。我用@JohnKugelman的建议更改了脚本,跳过非http,并且只对Github repos执行此操作。对于迭代所有远程,它将如何影响git config--get remote.origin.url
?此外,我认为我们不需要USERNAME
,这可以从$remote
变量中的repo remote url推断出来。如果需要一些正则表达式,我可以稍后再讨论,或者其他人可以继续改进它。由于它是一次性使用的,因此使它变得越来越灵活肯定会有越来越小的回报。这也是Bash 4+中shopt-s globstar
的一个很好的使用案例。