简短:有没有办法让git repo推送到远程回购列表(而不是单个“来源”)?
长:当我在多台计算机上开发一个应用程序时,我经常遇到这种情况,它有不同的连接性 - 比如在运输途中是笔记本电脑,在我在某个位置时是电脑“A”,另一台是“B”在另一个。此外,笔记本电脑可能只与“A”或“B”连接,有时两者兼而有之。
我想要的是让git始终“拉”并“推”到它当前可以连接的所有计算机上,这样就可以更轻松地从一台机器跳到另一台机器并继续无缝工作。
您可以使用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
的简写(实际上它在配置文件中查找以确定这一点,但你得到了这个想法)。
要推送更新,您必须手动对每个仓库执行此操作。我认为,推动设计时考虑了中央存储库工作流程。
为了更新遥控器(即pull
案例),事情变得更加容易。
莱纳斯的声明
可悲的是,甚至没有办法用git别名伪造这个。
在Git mailing list的elliottcable's answer的参考条目不再是真的。
git fetch
在过去的某个地方学习了--all
参数,允许一次性获取所有遥控器。
如果不是全部请求,可以使用--multiple
开关来指定多个遥控器或组。
使用以下命令为全局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远程的所有遥控器。
我想在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)
简单的方式,为我工作...希望这有助于某人。
添加all
遥控器有点单调乏味,因为您必须在您使用的每台机器上进行设置。
此外,bash
和git
别名提供所有假设你将推动所有遥控器。 (例如:我有一个sshag
的分支,我在GitHub和GitLab上维护。我添加了上游远程,但我没有权限推送它。)
这是一个git
别名,只推送带有包含@
的推送URL的遥控器。
psall = "!f() { \
for R in $(git remote -v | awk '/@.*push/ { print $1 }'); do \
git push $R $1; \
done \
}; f"
添加新的远程
git remote add upstream https://github.com/example-org/example-repo.git
git remote -vv
从多个位置获取
git fetch --all
推送到位置
git push -u upstream/dev
现在版本的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 = [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/Master
和Codaset/Master
,让生活变得更轻松。
从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
。
我将这些别名添加到〜/ .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;'
您可以添加遥控器:
git remote add a urla
git remote add b urlb
然后更新所有repos做:
git remote update
这是我在.gitconfig
别名部分中使用bash脚本的示例
[alias]
pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"
我在.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"
你需要一个脚本来循环它们。 Git没有提供“全力以赴”。理论上你可以在多个线程中进行推送,但是本机方法不可用。
抓取更复杂,我建议线性地做。
我认为你最好的答案是拥有一台机器,每个人都可以推/拉,如果可能的话。
我冒昧地从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。