我有一个目录,其中包含超过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" \;
问题是,括号{}被相对路径替换,所以我最终得到以下命令:
git remote set-url origin git@euxxx-x-x-xxx01.xx.xx.xxx.com:/foo/bar/./zaz/repo.git
但我只需要
git remote set-url origin git@euxxx-x-x-xxx01.xx.xx.xxx.com:/foo/bar/repo.git
如何实现这一目标?
答案 0 :(得分:2)
答案 1 :(得分:1)
尝试这样的事情:
var dungeonsSchema = new mongoose.Schema({
name : {type: String, required: true, unique: true},
owner : {type: String, required: true},
blocks : {type: [[Number]]},
});
其中压缩到以下单行:
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
修改:感谢Mark Reed指出了一种更好的方法来迭代dirnames。
答案 2 :(得分:1)
几次,当我需要此命令时,这是由于公司DNS的更改而导致回购名称的更改。以下脚本有助于自动化。我不喜欢在循环中使用目录名称,因为有时文件夹名称与实际的回购名称不同,这就是为什么git是最好的“事实来源”。
以下脚本将在该脚本所在目录的所有文件夹中递归地将名为“ origin”的远程站点中“ github.com”的所有实例替换为“ gitlab.com”。您可以使用“ SEARCH_ROOT”变量覆盖它
channel
答案 3 :(得分:0)
您可以使用find *
代替find .
。然后路径名将匹配。
答案 4 :(得分:0)
这应适用于任何可能具有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
答案 5 :(得分:-1)
您可以使用此Shell脚本来更改远程URL Shell script to bulk change git remote url