Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将系统上所有git存储库的远程地址从http更改为ssh_Linux_Bash_Git_Ssh_Windows Subsystem For Linux - Fatal编程技术网

Linux 将系统上所有git存储库的远程地址从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

最近Github发布了一个弃用通知,指出推送到存储库的HTTP方法即将过期。我决定改为SSH方法。在这样做时,我发现我们需要在设置密钥后更改repo的远程URL

但是更改是一个乏味的过程,要对本地系统中的所有存储库进行更改是一项相当长的工作。我们是否可以编写一个Bash脚本,逐个遍历目录,然后将远程URL从HTTP版本更改为SSH版本

这对HTTP->SSH进行了必要的更改

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
的一个很好的使用案例。