简短:有没有办法让git repo推送到远程回购列表(而不是单个“原点”)?
长期:当我在多台计算机上开发应用程序时,我经常遇到这样的情况:连接不同 - 例如在运输途中是笔记本电脑,在我使用时是电脑“A”某个位置,另一台计算机“B”。此外,笔记本电脑可能只与“A”或“B”连接,有时两者都连接。
我希望git始终“拉”并“推”到它当前可以连接的所有计算机上,这样就可以更轻松地从一台机器跳到另一台机器并继续无缝工作。
答案 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/Master
和Codaset/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
别名部分
[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的陈述
<{3}}中Git mailing list的引用条目中的可悲的是,甚至没有办法用git伪装出来 别名。
不再是真的。
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
遥控器有点单调乏味,因为您必须在您使用的每台计算机上进行设置。
此外,bash
和git
别名提供了所有假设您将推送到所有遥控器。
(例如:我有一个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 此选项不同。
git clone git@github.com:myuser/myrepo.git
git remote set-url --add origin git@gitlab.com:myuser/myrepo.git
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
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