首页 文章

从多个远程位置拉/推

提问于
浏览
631

The short: 有没有办法让git repo推送到远程回购列表(而不是单个"origin")?

The long: 我常常遇到某个位置,而另一台计算机"B" . 此外,笔记本电脑可能只与"A"或"B"连接,有时两者兼而有之 .

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

14 回答

  • 725

    您可以使用 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 的简写(实际上它在配置文件中查找以确定这一点,但你明白了) .

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

  • 3

    Doing this manually is no longer necessary ,现代版 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 ,让生活变得更轻松 .

  • 3

    最新版本的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 . 如果您也希望能够从他们那里 git pull ,请忽略 --push .

  • 18

    我将这些别名添加到〜/ .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;'
    
  • 28

    您可以添加遥控器:

    git remote add a urla
    git remote add b urlb
    

    然后更新所有repos做:

    git remote update
    
  • 224

    这是我在 .gitconfig 别名部分中使用bash脚本的示例

    [alias]
            pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"
    
  • 13

    我在.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"
    
  • 432

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

    抓取更复杂,我建议线性地做 .

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

  • 1

    我冒昧地扩大了来自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 .

  • -2

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

    莱纳斯的声明

    可悲的是,甚至没有办法用git别名来伪装这个 .

    elliottcable's answer中的Git mailing list的引用条目中不再是真的 .

    git fetch在过去的某个地方学习了 --all 参数,允许一次性获取所有遥控器 .

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

  • 0

    使用以下命令为全局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

    并且代码将更新到包括origin remote的所有遥控器 .

  • 1

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

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

    像冠军一样工作......

    要进行健全性检查,请发出“git remote -v”以列出与项目关联的存储库 .

    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)
    

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

  • 6

    添加 all 遥控器有点繁琐,因为您必须在您使用的每台机器上进行设置 .

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

    这是一个 git 别名,只推送带有包含 @ 的推送网址的遥控器 .

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

  • 3

    添加新的遥控器

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

    从多个位置获取

    git fetch --all
    

    推送到位置

    git push -u upstream/dev
    

相关问题