如何在Bash中更新多个git存储库的远程URL?

时间:2019-02-14 20:50:14

标签: bash git git-remote

我有一堆git repos已被移到另一台主机。我可以使用

来更新单个仓库的遥控器

git remote set-url origin <url>

如何自动执行数十个存储库?基本上,我需要替换网址的主机名/路径部分。

5 个答案:

答案 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

希望这对某人有用。