能够用一个命令推到所有git遥控器?

而不是做:

git push origin --all && git push nodester --all && git push duostack --all

有没有一种方法只用一个命令就能做到这一点?

谢谢:)

51437 次浏览

创建一个all远程对象,其名称包含几个repo url:

git remote add all origin-host:path/proj.git
git remote set-url --add all nodester-host:path/proj.git
git remote set-url --add all duostack-host:path/proj.git

然后是git push all --all


这是它在.git/config中的样子:

  [remote "all"]
url = origin-host:path/proj.git
url = nodester-host:path/proj.git
url = duostack-host:path/proj.git

作为编辑.git/config文件的CLI替代方案,您可以使用以下命令:

# git remote add all origin-host:path/proj.git
# git remote set-url --add all nodester-host:path/proj.git
# git remote set-url --add all duostack-host:path/proj.git

同样的git push all --all在这里也起作用。

你已经完成了与答案1相同的任务。您只是使用命令行而不是对配置文件进行原始编辑。

我写了一个简短的bash函数,在一次调用中推送到多个远程。您可以指定单个遥控器作为参数,多个遥控器用空格分隔,或者不指定任何遥控器以将其推送到所有遥控器。

这可以添加到您的.bashrc或.bash_profile。

function GitPush {
REMOTES=$@


# If no remotes were passed in, push to all remotes.
if [[ -z "$REMOTES" ]]; then
REM=`git remote`


# Break the remotes into an array
REMOTES=$(echo $REM | tr " " "\n")
fi


# Iterate through the array, pushing to each remote
for R in $REMOTES; do
echo "Pushing to $R..."
git push $R
done
}

示例:假设您的repo有3个遥控器:rem1、rem2和rem3。

# Pushes to rem1
GitPush rem1


# Pushes to rem1 and rem2
GitPush rem1 rem2


# Pushes to rem1, rem2 and rem3
GitPush

将所有分支推到所有遥控器:

git remote | xargs -L1 git push --all

或者如果你想把一个特定的分支推到所有的遥控器:

master替换为你想要推的分支。

git remote | xargs -L1 -I R git push R master

(奖励)为命令创建一个git别名:

git config --global alias.pushall '!git remote | xargs -L1 git push --all'

运行git pushall现在将把所有分支推到所有远程。

如果你想总是推到repo1, repo2和repo3,但总是只从repo1拉,将远程“origin”设置为

[remote "origin"]
url = https://exampleuser@example.com/path/to/repo1
pushurl = https://exampleuser@example.com/path/to/repo1
pushurl = https://exampleuser@example.com/path/to/repo2
pushurl = https://exampleuser@example.com/path/to/repo3
fetch = +refs/heads/*:refs/remotes/origin/*

在命令行配置:

$ git remote add origin https://exampleuser@example.com/path/to/repo1
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo1
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo2
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo3

如果你只有想从repo1中提取,但却推到repo1repo2 对于一个特定的分支specialBranch:

[remote "origin"]
url = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
fetch = +refs/heads/*:refs/remotes/origin/*
...
[remote "specialRemote"]
url = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
pushurl = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
pushurl = ssh://git@aaa.xxx.com:7999/yyy/repo2.git
fetch = +refs/heads/*:refs/remotes/origin/*
...
[branch "specialBranch"]
remote = origin
pushRemote = specialRemote
...

看到https://git-scm.com/docs/git-config#git-config-branchltnamegtremote

你可以利用git钩子 -特别是pre-push:向.git/hooks/pre-push添加非源推。

如果你已经有一个使用origin作为默认远程的存储库,并且想要通过调用git push(或使用IDE /文本编辑器的git sync按钮)来推送到多个远程存储库,首先添加当前的origin URL(用于所有操作,例如pushpullfetch)作为特定于推送的远程源URL:

git remote set-url --push --add origin "$(git remote get-url --push origin)"

... 然后将彼此的远程存储库添加到特定于推送的url中,就像这样:

git remote set-url --push --add origin "git@github.com:username/repo-name.git"

现在所有的获取和拉取操作都只能从原始的远程存储库中获取。

但是通过一个简单的git push, git将你的最新更改推送到你现在添加的所有远程存储库。