在各种存储库中批量更改 git 远程源 - bash 命令

Mic*_*zyk 5 git bash find

我有一个目录,其中包含 20 多个 git 存储库。我必须更改每个文件中的远程原始 URL。我不想手动执行此操作,而是想使用以下命令:

find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && git remote set-url origin git@euxxx-x-x-xxx01.xx.xx.xxx.com:/foo/bar/'{}'.git" \;
Run Code Online (Sandbox Code Playgroud)

问题是,括号 {} 被相对路径替换,所以我最终得到以下命令:

git remote set-url origin git@euxxx-x-x-xxx01.xx.xx.xxx.com:/foo/bar/./zaz/repo.git
Run Code Online (Sandbox Code Playgroud)

但我只需要

git remote set-url origin git@euxxx-x-x-xxx01.xx.xx.xxx.com:/foo/bar/repo.git
Run Code Online (Sandbox Code Playgroud)

如何实现这一目标?

And*_*rew 11

有几次我需要这个,是因为公司 DNS 发生了变化,导致存储库名称发生了变化。以下脚本有助于实现自动化。我不喜欢在循环中使用目录名称,因为有时文件夹名称与实际的存储库名称不同,这就是为什么 git 是最好的“事实来源”。

以下脚本将在该脚本所在目录的所有文件夹中递归地将远程中名为“origin”的所有“github.com”实例替换为“gitlab.com”。您可以使用“SEARCH_ROOT”变量覆盖它

#/bin/bash
SEARCH_ROOT=./
PATTERN=github.com
REPLACEMENT=gitlab.com
find "$SEARCH_ROOT" -type d -name "\.git"  -print | while read -r REPO;
do
  pushd "$REPO/../" > /dev/null || continue
  NEWURL=$(git remote get-url origin | grep "$PATTERN" | sed "s/$PATTERN/$REPLACEMENT/g")
  [ -z "$NEWURL" ] || git remote set-url origin "$NEWURL"
  popd > /dev/null || exit 1
done
Run Code Online (Sandbox Code Playgroud)


Seb*_*icz 6

尝试这样的事情:

find * -maxdepth 0 -type d \( ! -name . \) -print | while read dir
do
    cd $dir && git remote set-url origin git@euxxx-x-x-xxx01.xx.xx.xxx.com:/foo/bar/$dir.git && cd ..
done
Run Code Online (Sandbox Code Playgroud)

其压缩为以下一行:

find * -maxdepth 0 -type d \( ! -name . \) -print | while read dir; do cd $dir && git remote set-url origin git@euxxx-x-x-xxx01.xx.xx.xxx.com:/foo/bar/$dir.git && cd ..; done
Run Code Online (Sandbox Code Playgroud)

编辑:感谢 Mark Reed 指出了迭代目录名的更好方法。