从多个远程位置拉/推

问题描述 投票:683回答:14

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

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

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

git
14个回答
464
投票

您可以使用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
投票

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

莱纳斯的声明

可悲的是,甚至没有办法用git别名伪造这个。

Git mailing listelliottcable's answer的参考条目不再是真的。

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

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


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

并且代码将更新到包括origin远程的所有遥控器。


2
投票

我想在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)

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


1
投票

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

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

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

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

763
投票

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

转载于此:

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

Original answer:

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

araqnid的解决方案是将代码放入存储库的合适解决方案......但是,当你和我一样,有多个等效的权威上游(我将一些更重要的项目克隆到私有上游,GitHub和Codaset)时,它可以是每天都要努力改变每一个人。

长话短说,git remote add你所有的遥控器单独...然后git config -e并添加一个合并遥控器。假设你有这个存储库config

[remote "GitHub"]
    url = [email protected]:elliottcable/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/GitHub/*
[branch "Master"]
    remote = GitHub
    merge = refs/heads/Master
[remote "Codaset"]
    url = [email protected]:elliottcable/paws-o.git
    fetch = +refs/heads/*:refs/remotes/Codaset/*
[remote "Paws"]
    url = [email protected]:Paws/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/Paws/*

...为"Paws""Codaset"创建一个合并的遥控器,我可以在所有这些之后添加以下内容:

[remote "Origin"]
    url = [email protected]:Paws/Paws.o.git
    url = [email protected]:elliottcable/paws-o.git

一旦我完成了这个,当我git push Origin Master时,它会依次推向Paws/MasterCodaset/Master,让生活变得更轻松。


247
投票

从git 1.8(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


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;'

22
投票

您可以添加遥控器:

git remote add a urla
git remote add b urlb

然后更新所有repos做:

git remote update

14
投票

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

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

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"

3
投票

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

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

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


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。

© www.soinside.com 2019 - 2024. All rights reserved.