做空者:有没有一种方法可以让git回购推送到远程回购列表(而不是一个单一的“来源”)中并从中提取?
长篇大论:当我在多台电脑上开发一个应用程序时,我经常会遇到这样的情况,这些电脑具有不同的连接能力——比如,一台笔记本电脑在运输途中,一台电脑“a”在某个位置,另一台电脑则“B”在另一台位置。此外,笔记本电脑可能只与“A”或“B”连接,有时两者都连接。
我希望git始终“拉”到它当前可以连接的所有计算机,这样从一台机器跳到另一台机器,继续无缝工作就更容易了。
做空者:有没有一种方法可以让git回购推送到远程回购列表(而不是一个单一的“来源”)中并从中提取?
长篇大论:当我在多台电脑上开发一个应用程序时,我经常会遇到这样的情况,这些电脑具有不同的连接能力——比如,一台笔记本电脑在运输途中,一台电脑“a”在某个位置,另一台电脑则“B”在另一台位置。此外,笔记本电脑可能只与“A”或“B”连接,有时两者都连接。
我希望git始终“拉”到它当前可以连接的所有计算机,这样从一台机器跳到另一台机器,继续无缝工作就更容易了。
当前回答
使用现代版本的git,不再需要手动执行此操作!见下文Malvineous的解决方案。
此处转载:
git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>
原答覆:
这是我用了很长时间没有坏后果的东西,是Linus Torvalds在git邮件列表中建议的。
araqnid的解决方案是将代码引入存储库的合适解决方案……但如果你和我一样拥有多个同等的权威上游(我将一些更关键的项目克隆到私有上游、GitHub和Codaset),那么每天都要对每个项目进行更改可能会很痛苦。
长话短说,gitremote单独添加所有远程……然后git-config-e并添加一个合并的远程。假设您有此存储库配置:
[remote "GitHub"]
url = git@github.com:elliottcable/Paws.o.git
fetch = +refs/heads/*:refs/remotes/GitHub/*
[branch "Master"]
remote = GitHub
merge = refs/heads/Master
[remote "Codaset"]
url = git@codaset.com:elliottcable/paws-o.git
fetch = +refs/heads/*:refs/remotes/Codaset/*
[remote "Paws"]
url = git@github.com:Paws/Paws.o.git
fetch = +refs/heads/*:refs/remotes/Paws/*
…要为“Paws”和“Codaset”创建一个合并的远程,我可以在所有这些之后添加以下内容:
[remote "Origin"]
url = git@github.com:Paws/Paws.o.git
url = git@codaset.com:elliottcable/paws-o.git
一旦我做到了这一点,当我按下Origin Master时,它将按顺序推送到Paws/Master和Codaset/Master,这让生活变得简单了一点。
其他回答
添加新远程
git remote add upstream https://github.com/example-org/example-repo.git
git remote -vv
从多个位置提取
git fetch --all
推送至位置
git push -u upstream/dev
添加all remote有点乏味,因为您必须在使用的每台机器上进行设置。
此外,提供的bash和git别名都假定您将推送到所有远程。(例如:我在GitHub和GitLab上维护了一个sshag分支。我添加了上游远程,但我没有权限推送它。)
这里有一个git别名,它只通过包含@的推送URL推送到远程设备。
psall = "!f() { \
for R in $(git remote -v | awk '/@.*push/ { print $1 }'); do \
git push $R $1; \
done \
}; f"
下面是我在.gitconfig别名部分中使用bash脚本的示例
[alias]
pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"
我冒昧地扩大了诺娜·乌比兹的答案;只需将此添加到~/.bashrc:
git-pullall () { for RMT in $(git remote); do git pull -v $RMT $1; done; }
alias git-pullall=git-pullall
git-pushall () { for RMT in $(git remote); do git push -v $RMT $1; done; }
alias git-pushall=git-pushall
用法:
git-pullall master
git-pushall master ## or
git-pushall
如果您没有为git pulll提供任何分支参数,那么来自非默认远程的pull将失败;保持这种行为不变,因为它类似于git。
从第一个URL克隆:
git clone git@github.com:myuser/myrepo.git
查看当前远程:
$ git remote -v
origin git@github.com:myuser/myrepo.git (fetch)
origin git@github.com:myuser/myrepo.git (push)
为原点添加第二个遥控器:
git remote set-url --add origin git@bitbucket.org:myuser/myrepo.git
确认已列出两个遥控器以进行推送:
$ git remote -v
origin git@github.com:myuser/myrepo.git (fetch)
origin git@github.com:myuser/myrepo.git (push)
origin git@bitbucket.org:myuser/myrepo.git (push)
$ git config --local --get-regexp ^remote\..+\.url$
remote.origin.url git@github.com:myuser/myrepo.git
remote.origin.url git@bitbucket.org:myuser/myrepo.git
按顺序推送到所有URL:
git push
要删除远程:
git remote set-url --delete origin git@bitbucket.org:myuser/myrepo.git