从多个远程位置拉/推

时间:2009-05-11 18:07:38

标签: git

简短:有没有办法让git repo推送到远程回购列表(而不是单个“原点”)?

长期:当我在多台计算机上开发应用程序时,我经常遇到这样的情况:连接不同 - 例如在运输途中是笔记本电脑,在我使用时是电脑“A”某个位置,另一台计算机“B”。此外,笔记本电脑可能只与“A”或“B”连接,有时两者都连接。

我希望git始终“拉”并“推”到它当前可以连接的所有计算机上,这样就可以更轻松地从一台机器跳到另一台机器并继续无缝工作。

15 个答案:

答案 0 :(得分:758)

不再需要手动执行此操作,使用现代版git!请参阅下面的Malvineous解决方案。

转载于此:

git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>

原始答案:

我已经使用了很长一段时间但没有不良后果的事情,Linus Torvalds在git mailing list上建议。

araqnid 的解决方案是将代码带入您的存储库的合适解决方案......但是,当您像我一样,拥有多个等效的权威上游(我保留了一些克隆到私有上游,GitHub和Codaset的更多关键项目,每天都要对每个项目进行更改会很痛苦。

长话短说,单独git remote add所有遥控器......然后git config -e并添加合并遥控器。假设您拥有此存储库config

[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

完成此操作后,当我git push Origin Master时,它会依次推送到Paws/MasterCodaset/Master,让生活变得更轻松。

答案 1 :(得分:459)

您可以使用git remote命令配置多个远程存储库:

git remote add alt alt-machine:/path/to/repo

要从所有已配置的遥控器获取并更新跟踪分支,但不要合并到HEAD,请执行以下操作:

git remote update

如果它当前没有连接到其中一个遥控器,则会花费时间或发出错误,然后继续下一个。您必须手动合并所提取的存储库或者挑选,这取决于您希望如何组织收集更改。

要从alt获取主分支并将其拉入当前头部,请执行以下操作:

git pull alt master

所以实际上git pull几乎是git pull origin HEAD的简写(实际上它在配置文件中查找以确定这一点,但你明白了。)

要推送更新,您必须手动对每个仓库执行此操作。我认为,推动设计时考虑了中央存储库工作流程。

答案 2 :(得分:241)

最新版本的git(截至2012年10月)允许您从命令行执行此操作:

git remote set-url origin --push --add user1@repo1
git remote set-url origin --push --add user2@repo2
git remote -v

然后git push将推送到user1 @ repo1,然后推送到user2 @ repo2。如果您也希望--push能够git pull,请忽略{。}}。

答案 3 :(得分:29)

我将这些别名添加到〜/ .bashrc:

alias pushall='for i in `git remote`; do git push $i; done;'
alias pullall='for i in `git remote`; do git pull $i; done;'

答案 4 :(得分:20)

您可以使用以下内容添加遥控器:

git remote add a urla
git remote add b urlb

然后更新所有repos do:

git remote update

答案 5 :(得分:14)

以下是我在.gitconfig别名部分

中使用bash脚本的示例
[alias]
        pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"

答案 6 :(得分:7)

我在.git congfig文件中向远程“origin”添加了两个单独的pushurl。当我运行git push origin "branchName"然后它将运行并推送到每个网址。不确定是否有更简单的方法来实现这一点,但这适用于我自己推送到Github源代码并同时推送到My.visualStudio源代码。

[remote "origin"]
  url = "Main Repo URL"
  fetch = +refs/heads/*:refs/remotes/origin/*
  pushurl = "repo1 URL"
  pushurl = "reop2 URl"

答案 7 :(得分:3)

你需要一个脚本来循环它们。 Git没有提供“全力以赴”。理论上你可以在多个线程中进行推送,但是本机方法不可用。

抓取更加复杂,我建议线性化。

我认为你最好的答案是拥有一台机器,每个人都可以推/拉,如果可能的话。

答案 8 :(得分:3)

我冒昧地扩大了来自nona-urbiz的answer;只需将其添加到〜/ .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-pullall提供任何分支参数,则非默认遥控器的拉动将失败;保持这种行为,因为它类似于git。

答案 9 :(得分:3)

为了更新遥控器(即pull案例),事情变得更加容易。

Linus的陈述

  

可悲的是,甚至没有办法用git伪装出来   别名。

<{3}}中Git mailing list的引用条目中的

不再是真的。

elliottcable's answer在过去的某个地方学习了--all参数,允许一次性获取所有遥控器。

如果不是全部请求,可以使用--multiple开关指定多个遥控器或一组。

答案 10 :(得分:2)

我想在VSO / TFS中工作,然后在准备好时公开推送到GitHub。在私人VSO中创建的初始仓库。当我加入GitHub时,我做了:

git remote add mygithubrepo https://github.com/jhealy/kinect2.git
git push -f mygithubrepo master

像冠军一样......

为了进行健全性检查,请发出&#34; git remote -v&#34;列出与项目关联的存储库。

C:\dev\kinect\vso-repo-k2work\FaceNSkinWPF>git remote -v
githubrepo      https://github.com/jhealy/kinect2.git (fetch)
githubrepo      https://github.com/jhealy/kinect2.git (push)
origin  https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (fetch)
origin  https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (push)

简单的方式,为我工作......希望这有助于某人。

答案 11 :(得分:2)

使用以下命令为全局gitconfig(/home/user/.gitconfig)添加别名。

git config --global alias.pushall '!f(){ for var in $(git remote show); do echo "pushing to $var"; git push $var; done; }; f'

提交代码后,我们说

  

git push

默认情况下推送到原点。在上面的别名之后,我们可以说

  

git pushall

并且代码将更新到所有遥控器,包括原始遥控器。

答案 12 :(得分:1)

添加all遥控器有点单调乏味,因为您必须在您使用的每台计算机上进行设置。

此外,bashgit 别名提供了所有假设您将推送到所有遥控器。 (例如:我有一个sshag的分支,我在GitHub和GitLab上维护。我添加了上游远程,但我没有权限推送它。)

以下是git 别名,只推送包含@的推送网址的远程用户。

psall    = "!f() { \
    for R in $(git remote -v | awk '/@.*push/ { print $1 }'); do \
    git push $R $1; \
    done \
    }; f"

答案 13 :(得分:1)

此答案与以前的答案不同,因为它避免了git remote--push命令中不必要set-url选项的使用。这样,两个URL的配置都是对称的。对于怀疑论者来说,cat ./.git/config所示的git配置看起来与 with without 此选项不同。

  1. 从第一个URL克隆:
git clone git@github.com:myuser/myrepo.git
  1. 添加第二个URL
git remote set-url --add origin git@gitlab.com:myuser/myrepo.git
  1. 确认两个URL都针对push
$ git remote -v
origin  git@github.com:myuser/myrepo.git (fetch)
origin  git@github.com:myuser/myrepo.git (push)
origin  git@gitlab.com:myuser/myrepo.git (push)

$ git config --local --get-regexp ^remote\..+\.url$
remote.origin.url git@github.com:myuser/myrepo.git
remote.origin.url git@gitlab.com:myuser/myrepo.git
  1. 按顺序推送所有URL:
git push

要删除添加的URL,请执行以下操作:

git remote set-url --delete origin git@gitlab.com:myuser/myrepo.git

答案 14 :(得分:-3)

  

添加新远程

git remote add upstream https://github.com/example-org/example-repo.git

git remote -vv
  

从多个位置获取

git fetch --all
  

推送到位置

git push -u upstream/dev