从多个远程位置拉/推

Zor*_*lla 713 git

简短:有没有办法让git repo推送到远程回购列表(而不是单个"来源")?

长:当我在多台计算机上开发一个应用程序时,我经常遇到这种情况,它有不同的连接 - 比如在运输途中是笔记本电脑,在我在某个位置时是电脑"A",另一台是"B"在另一个.此外,笔记本电脑可能只与"A"或"B"连接,有时两者兼而有之.

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

ELL*_*BLE 781

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

转载于此:

git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>
Run Code Online (Sandbox Code Playgroud)

原始答案:

这一点我已经使用了很长一段时间没有不良后果,并由Linus Torvalds在git邮件列表上提出建议.

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/*
Run Code Online (Sandbox Code Playgroud)

...创建一个合并远程的"Paws""Codaset",我可毕竟那些添加以下内容:

[remote "Origin"]
    url = git@github.com:Paws/Paws.o.git
    url = git@codaset.com:elliottcable/paws-o.git
Run Code Online (Sandbox Code Playgroud)

一旦我完成了这项工作,当我完成这项任务时git push Origin Master,它将推动两者Paws/MasterCodaset/Master顺序完成,让生活变得更轻松.

  • `git config -e`在首选编辑器中打开`.git/config`文件. (101认同)
  • 我将"origin"遥控器命名为"all",使其语义更加清晰 (25认同)
  • 以防万一.确认拥有2个URL的遥控器仍然可以在1.7.12.4上完成工作.谢谢. (3认同)
  • @JamesWomack 见@Malvineous 的回答,如下。现在“更正确”了,因为`git` 的命令行本身就支持这一点,使用`git remote set-url ... --add`。 (3认同)
  • 我不是一个传统的人。我的第一台 UNIX 机器是 Mac,大写的主目录永远地损害了我。只是我自己的方法;与问题不太相关。;) (2认同)

ara*_*nid 483

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

git remote add alt alt-machine:/path/to/repo
Run Code Online (Sandbox Code Playgroud)

要从所有已配置的远程数据库获取并更新跟踪分支,但不要合并到HEAD,请执行以下操作:

git remote update
Run Code Online (Sandbox Code Playgroud)

如果它当前没有连接到其中一个遥控器,则需要时间或抛出错误,然后继续下一个.您必须从获取的存储库或者挑选中手动合并,具体取决于您希望如何组织收集更改.

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

git pull alt master
Run Code Online (Sandbox Code Playgroud)

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

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

  • "git pull"基本上是"git fetch",其次是"git merge"."git remote update"只为你做了一堆"git fetch"调用.那么剩下的就是做"git merge"位.你可以说"git merge origin/master",它会将origin的master版本合并到你当前的HEAD中."git pull origin master"做了同​​样的事情,虽然它会首先进行一次获取(如果你已经完成了git远程更新,那么就没有更多内容可以获取,所以它是多余的).是的,你可以说"git push foo",它会将所有匹配的分支推送到名为"foo"的遥控器. (8认同)
  • 显然,您也可以通过一次推送进行多次回购,请查看此答案以获取更多详细信息http://stackoverflow.com/questions/14290113/git-pushing-code-to-two-remotes (2认同)

Mal*_*ous 256

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

git remote set-url origin --push --add user1@repo1
git remote set-url origin --push --add user2@repo2
git remote -v
Run Code Online (Sandbox Code Playgroud)

然后git push将推送到user1 @ repo1,然后推送到user2 @ repo2.git push如果你也希望能够git push从他们那里离开,请不要理会.

  • 我强烈建议不要这个解决方案.我们已经在我们公司使用它,并且在一个存储库中挂钩失败而在另一个存储库中失败时遇到了严重问题.然后,变更集仅出现在一个存储库中. (16认同)
  • 啊,是的,这可能会变得棘手.但对我来说,似乎钩子需要重新设计.失败的推送不会正常破坏git,因此引入新的失败点(这也会阻止您使用漂亮的git功能)可能不是最好的解决方案.当然我不知道你的要求是什么意思... (9认同)
  • 问题是修复被拒绝的推送涉及更改已经推送到其他回购的提交.所以,如果有人在修复之前已经根据这些提交进行了工作,事情变得非常糟糕,我们的办公室就是这种情况. (7认同)
  • @MichaelSchmeißer:大概你可以在推动时看到错误信息,解决问题,然后再次按下以使一切恢复到清洁状态? (4认同)
  • 不.自从写完我的问题以来,我已经阅读了其他网络帖子,然后测试了这个东西.从阅读其他帖子,我怀疑只使用了第一行.我刚刚对此进行了测试:实际上,只有第一行的URL由`git fetch`检查.(鉴于此,我不明白`git remote set-url --add`的目的是什么,没有`--push`.) (3认同)
  • 我试图删除--push以便能够提取和推送,但是当我使用“ git remote -v”时,我只能看到我添加的新遥控器为(push)。我究竟做错了什么? (2认同)
  • 省略`--push`不会添加两个获取URL。远程存储库始终只有一个访存URL。必须为每个存储库URL执行单独的`git pull &lt;repo_url&gt;`。至少那是我使用Git 1.9所获得的 (2认同)

Non*_*biz 31

我将这些别名添加到〜/ .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;'
Run Code Online (Sandbox Code Playgroud)

  • 这太棒了!我最终得到了一个Git别名:`git config alias.pushall'!我在`git remote`; 做git push $ i; 完成;'` (5认同)

Fel*_*peC 23

您可以添加遥控器:

git remote add a urla
git remote add b urlb
Run Code Online (Sandbox Code Playgroud)

然后更新所有repos做:

git remote update
Run Code Online (Sandbox Code Playgroud)


tro*_*oex 15

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

[alias]
        pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"
Run Code Online (Sandbox Code Playgroud)


s.h*_*sam 14

2023 年更新

\n

如果您想同时推送多个遥控器,您可能对 git 非常了解。我们在 git 中将远程存储库称为遥控器。将更改推送到遥控器将是通常开发周期的一部分。

\n

有时,您可能需要将更改推送到多个遥控器,例如 GitHub、bitbucket 等。为此,您可以按照给定的说明进行操作。

\n

列出您现有的遥控器

\n

您可以使用以下命令列出所有可用的遥控器。

\n
git remote -v\n
Run Code Online (Sandbox Code Playgroud)\n

假设您尚未配置任何(其他)远程。您可以使用 git 远程来完成此操作。

\n
git remote add  remote_name  remote_url\n
Run Code Online (Sandbox Code Playgroud)\n

例子:

\n
git remote add github https//github.com/path/to/repo\n
Run Code Online (Sandbox Code Playgroud)\n

通常,我们通过默认来源寻址远程名称来推送更改,例如git push origin. 您可以配置多个遥控器组并给它们命名。因此,您可以通过引用该名称来推送所有这些遥控器。

\n

您可以使用 git remote 或 git config 命令或编辑配置文件来添加多个遥控器。

\n

由于git可以对多个遥控器进行分组,因此您可以按照以下任意一种方式配置多个遥控器同时推送(不需要全部)。

\n

使用 git Remote 添加遥控器

\n

您可以使用 git remote 将多个远程 URL 设置为单个远程。

\n

如果您还没有\xe2\x80\x99 名为“all”的远程,请使用创建它git remote add,然后使用git remote set-url --add将新URL 添加到现有远程。

\n
git remote add all <remote URL>\n
Run Code Online (Sandbox Code Playgroud)\n

然后

\n
git remote set-url  --add  all  <another remote URL>\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用 交叉检查添加的新遥控器git remote -v

\n

(或者)

\n

使用 git config 对多个遥控器进行分组

\n

git config命令用于配置git参数。它将.git/config根据给定的输入编辑文件。

\n
git config --add remote.all.url  https//domain.com/repo.git\ngit config --add remote.all.url  ssh://user@host/repos/repo.git\n
Run Code Online (Sandbox Code Playgroud)\n

注意不带--add选项的命令将替换现有的远程 URL。您可以在 验证更新的配置.git/config

\n

(或者)

\n

.git/config 如果您知道配置格式,请编辑文件以添加远程和多个远程 URL。

\n

现在,您可以通过引用分配了多个远程 URL 的远程名称来同时推送多个远程。

\n
git push all master\n
Run Code Online (Sandbox Code Playgroud)\n

您始终可以推送到多个远程存储库,而无需使用正式的 bash 语法对它们进行分组。

\n
git push server master && git push github master\n
Run Code Online (Sandbox Code Playgroud)\n


Acu*_*nus 8

这个答案与之前的答案不同,因为它避免了--pushgit remoteset-url命令中不必要和不对称地使用该选项。这样,两个 URL 的配置都是对称的。对于持怀疑态度的混帐配置如图长相不同的不用这个选项。cat ./.git/config

  1. 从第一个 URL 克隆:
git clone git@github.com:myuser/myrepo.git
Run Code Online (Sandbox Code Playgroud)
  1. 添加第二个网址
git remote set-url --add origin git@gitlab.com:myuser/myrepo.git
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)
  1. 按顺序推送到所有 URL:
git push
Run Code Online (Sandbox Code Playgroud)

要删除添加的 URL:

git remote set-url --delete origin git@gitlab.com:myuser/myrepo.git
Run Code Online (Sandbox Code Playgroud)


小智 7

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

[remote "origin"]
  url = "Main Repo URL"
  fetch = +refs/heads/*:refs/remotes/origin/*
  pushurl = "repo1 URL"
  pushurl = "reop2 URl"
Run Code Online (Sandbox Code Playgroud)


Joe*_*aly 5

我想在 VSO/TFS 中工作,然后在准备好后公开推送到 GitHub。在私有 VSO 中创建的初始存储库。当需要添加到 GitHub 时,我做了:

git remote add mygithubrepo https://github.com/jhealy/kinect2.git
git push -f mygithubrepo master
Run Code Online (Sandbox Code Playgroud)

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

要进行完整性检查,请发出“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)
Run Code Online (Sandbox Code Playgroud)

简单的方法,对我有用...希望这对某人有帮助。

  • 无缘无故地运行`git push -f`,例如`git push` 失败或确切知道某人在做什么,是一个坏主意,而且可能有害。这也没有回答问题,而是如何添加第二个遥控器。 (4认同)