我有一个目录,其中包含 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)
尝试这样的事情:
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 指出了迭代目录名的更好方法。