我有一堆git repos已被移到另一台主机。我可以使用
来更新单个仓库的遥控器 git remote set-url origin <url>
如何自动执行数十个存储库?基本上,我需要替换网址的主机名/路径部分。
答案 0 :(得分:1)
虽然可以使用git remote
命令,但对仓库sed
目录中的config
文件使用.git
更容易。
假设回购全部在old.example.com
上,并移至new.example.com
,并且您当前位于包含所有回购的父目录中:
find . -name ".git" -exec sed -i 's/old\.example\.com/new\.example\.com/g' {}/config \;
这将找到所有存储库(带有.git
目录),然后在config
文件的每一行上用新路径替换旧路径。
答案 1 :(得分:1)
为简单起见,我们假设所有存储库都在同一父目录中;在子目录上运行循环,以获取当前URL,替换主机并将URL放回原位:
cd parent_dir &&
for repo in *; do
cd $repo &&
remote=`git remote get-url origin` &&
remote=`echo $remote | sed s/oldhost/newhost/` &&
git remote set-url origin $remote &&
cd .. # back to parent
done
答案 2 :(得分:1)
如果存储库位于单个目录中,则可以使用一个简单的脚本,如下所示:
for r in *; do
git -C "$r" remote set-url origin "$(git -C "$r" remote get-url origin | sed s/old/new/)"
done
git -C <dir>
告诉Git在执行其他操作之前先进入repo目录。然后读取当前的远程URL并使用sed
进行替换。
不用说,在开始弄乱Git存储库的配置之前,最好进行备份。
答案 3 :(得分:0)
@match的答案对我有用。尽管我不得不承认我已经从其他答案中添加了其他内容。 在这里使用OSX的人们,您可能想在新旧部分之前添加'-e。 所以整个事情可能是:
find . -name ".git" -exec sed -i ''
-e 's/old\.example\.com/new\.example\.com/g' {}/config \;
它为我工作,我从invalid command code ., despite escaping periods, using sed
获得了它答案 4 :(得分:0)
虽然找到.git目录并在该目录下的config上sed
可以正常运行,但我还是想让git处理这个问题。
这应该适用于可能具有git存储库的任何嵌套目录。它将找到任何.git目录,cd到该.git之上的目录,并检查给定的远程类型(默认为原点),并用新的remote修改旧的remote。用法是:./thisscript'git@github.com:oldcompany''git@github.com:newcompany'起源
如果您的遥控器是origin
,则无需传递第3个参数。希望这对人们有帮助。
#!/usr/bin/env bash
# Usage: ${0} [OLD_REMOTE] [NEW_REMOTE] [REMOTE_NAME]
OLD_REMOTE="${1:-bitbucket.org:mybbcompany}"
NEW_REMOTE="${2:-github.com:myghcompany}"
REMOTE_NAME="${3:-origin}"
find "${PWD}" -type d -name '.git' | while read dir; do
cd "${dir}/.."
current_remote_url=$(git remote get-url "${REMOTE_NAME}")
if grep "${OLD_REMOTE}" <<< "${current_remote_url}"; then
new_remote_url=$(sed "s/${OLD_REMOTE}/${NEW_REMOTE}/" <<< "${current_remote_url}")
echo "Changing ${current_remote_url} to ${new_remote_url}"
git remote set-url "${REMOTE_NAME}" "${new_remote_url}"
fi
done
希望这对某人有用。