做空者:有没有一种方法可以让git回购推送到远程回购列表(而不是一个单一的“来源”)中并从中提取?
长篇大论:当我在多台电脑上开发一个应用程序时,我经常会遇到这样的情况,这些电脑具有不同的连接能力——比如,一台笔记本电脑在运输途中,一台电脑“a”在某个位置,另一台电脑则“B”在另一台位置。此外,笔记本电脑可能只与“A”或“B”连接,有时两者都连接。
我希望git始终“拉”到它当前可以连接的所有计算机,这样从一台机器跳到另一台机器,继续无缝工作就更容易了。
做空者:有没有一种方法可以让git回购推送到远程回购列表(而不是一个单一的“来源”)中并从中提取?
长篇大论:当我在多台电脑上开发一个应用程序时,我经常会遇到这样的情况,这些电脑具有不同的连接能力——比如,一台笔记本电脑在运输途中,一台电脑“a”在某个位置,另一台电脑则“B”在另一台位置。此外,笔记本电脑可能只与“A”或“B”连接,有时两者都连接。
我希望git始终“拉”到它当前可以连接的所有计算机,这样从一台机器跳到另一台机器,继续无缝工作就更容易了。
你需要一个脚本来循环它们。Git不提供“推送全部”。理论上可以在多个线程中进行推送,但本地方法不可用。
提取甚至更复杂,我建议线性地进行。
我认为你最好的答案是有一台机器,如果有可能的话,每个人都可以推/拉它。
您可以使用gitremote命令配置多个远程存储库:
git remote add alt alt-machine:/path/to/repo
要从所有配置的远程获取并更新跟踪分支,但不合并到HEAD,请执行以下操作:
git remote update
如果它当前未连接到其中一个遥控器,则会花费时间或抛出错误,然后继续下一个。您将不得不从提取的存储库中手动合并,或者根据您想要组织收集更改的方式来选择。
要从alt获取主分支并将其拉入当前的头部,请执行以下操作:
git pull alt master
所以事实上,git pull几乎是git pull-origin HEAD的简写(实际上,它在配置文件中查找以确定这一点,但您可以理解)。
对于推送更新,您必须手动对每个回购进行推送。我认为,推送是在考虑中央存储库工作流的情况下设计的。
您可以通过以下方式添加遥控器:
git remote add a urla
git remote add b urlb
然后,要更新所有回购,请执行以下操作:
git remote update
使用现代版本的git,不再需要手动执行此操作!见下文Malvineous的解决方案。
此处转载:
git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>
原答覆:
这是我用了很长时间没有坏后果的东西,是Linus Torvalds在git邮件列表中建议的。
araqnid的解决方案是将代码引入存储库的合适解决方案……但如果你和我一样拥有多个同等的权威上游(我将一些更关键的项目克隆到私有上游、GitHub和Codaset),那么每天都要对每个项目进行更改可能会很痛苦。
长话短说,gitremote单独添加所有远程……然后git-config-e并添加一个合并的远程。假设您有此存储库配置:
[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
一旦我做到了这一点,当我按下Origin Master时,它将按顺序推送到Paws/Master和Codaset/Master,这让生活变得简单了一点。
我在~/.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;'
我冒昧地扩大了诺娜·乌比兹的答案;只需将此添加到~/.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 pulll提供任何分支参数,那么来自非默认远程的pull将失败;保持这种行为不变,因为它类似于git。
自git1.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.
下面是我在.gitconfig别名部分中使用bash脚本的示例
[alias]
pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"
为了更新遥控器(即拉杆箱),事情变得更容易了。
莱纳斯的声明
可悲的是,根本没有办法用一个数字来伪装别名
elliottcable的答案不再为真。
gitfetch在过去的某个地方学习了--all参数,允许一次性获取所有遥控器。
如果没有全部请求,可以使用--multiple开关来指定多个远程或一个组。
添加新远程
git remote add upstream https://github.com/example-org/example-repo.git
git remote -vv
从多个位置提取
git fetch --all
推送至位置
git push -u upstream/dev
我想在VSO/TFS中工作,然后在准备好后向GitHub公开推送。在私人VSO中创建的初始回购。当需要添加到GitHub时,我做到了:
git remote add mygithubrepo https://github.com/jhealy/kinect2.git
git push -f mygithubrepo master
像冠军一样工作。。。
要进行健全性检查,请发出“gitremote-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)
简单的方法,对我有用…希望这能帮助到某人。
我将两个单独的pushurl添加到.git配置文件中的远程“源”。当我运行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"
添加all remote有点乏味,因为您必须在使用的每台机器上进行设置。
此外,提供的bash和git别名都假定您将推送到所有远程。(例如:我在GitHub和GitLab上维护了一个sshag分支。我添加了上游远程,但我没有权限推送它。)
这里有一个git别名,它只通过包含@的推送URL推送到远程设备。
psall = "!f() { \
for R in $(git remote -v | awk '/@.*push/ { print $1 }'); do \
git push $R $1; \
done \
}; f"
使用以下命令向全局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推球
并且代码将被更新到所有远程设备,包括原始远程设备。
从第一个URL克隆:
git clone git@github.com:myuser/myrepo.git
查看当前远程:
$ git remote -v
origin git@github.com:myuser/myrepo.git (fetch)
origin git@github.com:myuser/myrepo.git (push)
为原点添加第二个遥控器:
git remote set-url --add origin git@bitbucket.org:myuser/myrepo.git
确认已列出两个遥控器以进行推送:
$ git remote -v
origin git@github.com:myuser/myrepo.git (fetch)
origin git@github.com:myuser/myrepo.git (push)
origin git@bitbucket.org:myuser/myrepo.git (push)
$ git config --local --get-regexp ^remote\..+\.url$
remote.origin.url git@github.com:myuser/myrepo.git
remote.origin.url git@bitbucket.org:myuser/myrepo.git
按顺序推送到所有URL:
git push
要删除远程:
git remote set-url --delete origin git@bitbucket.org:myuser/myrepo.git
2023年更新
如果您想同时推送多个遥控器,您可能已经足够了解git。我们在git中称远程存储库为remotes。将更改推到远程将是通常开发周期的一部分。
有时,您可能需要将更改推送到多个远程设备,如GitHub、bitbucket等。要做到这一点,您可以按照给定的说明进行操作。
列出您现有的遥控器
您可以使用以下命令列出所有可用的远程设备。
git remote -v
假设您尚未配置任何(其他)远程。您可以使用git remote来完成此操作。
git remote add remote_name remote_url
例子:
git remote add github https//github.com/path/to/repo
通常,我们通过默认原点寻址远程名称来推送更改,类似于git推送原点。您可以配置多个远程组并为其命名。所以你通过引用这个名字来推送所有这些遥控器。
通过使用gitremote或gitconfig命令或编辑配置文件,可以添加多个远程。
由于git可以对多个远程进行分组,您可以按照以下任何方式配置多个远程以同时推送(不需要全部)。
使用gitremote添加远程
您可以使用gitremote将多个远程URL设置为单个远程。
如果您还没有名为“all”的远程,请使用gitremoteadd创建它,然后使用gitremoteseturl-add向现有远程添加新的url。
git remote add all <remote URL>
Then
git remote set-url --add all <another remote URL>
您可以使用gitremote-v交叉检查添加的新远程。
(OR)
使用git-config对多个远程进行分组
gitconfig命令用于配置git参数。它将根据给定的输入编辑.git/config文件。
git config --add remote.all.url https//domain.com/repo.git
git config --add remote.all.url ssh://user@host/repos/repo.git
注意,没有--add选项命令将替换现有的远程URL。您可以在.git/config中验证更新的配置。
(OR)
如果您知道配置格式,请编辑文件.git/config以添加远程和多个远程URL。
现在,通过引用分配了多个远程URL的远程名称,您可以同时推送多个远程。
git push all master
您可以始终推送到多个远程存储库,而无需使用正式的bash语法对它们进行分组。
git push server master && git push github master
在Git的最新版本中,您可以为给定的远程添加多个pushurl。使用以下方法将两个推送URL添加到源代码中:
git remote set-url --add --push origin git://original/repo.git
git remote set-url --add --push origin git://another/repo.git
因此,当您推送到源时,它将推送到两个存储库。
更新1:Git 1.8.0.1和1.8.1(以及可能的其他版本)似乎有一个bug,导致在第一次使用时添加以替换原始URL,因此需要使用相同的命令重新添加原始URL。执行gitremote-v应该显示每个远程的当前URL。
更新2:Git维护人员Junio C.Hamano解释了它是如何设计的。执行git remote set url--add--push<remote_name>将为给定的远程添加一个pushurl,它将覆盖push的默认url。然而,您可以为一个给定的远程添加多个pushurl,这样您就可以使用一个git push推送到多个远程。您可以在下面验证此行为:
$ git clone git://original/repo.git
$ git remote -v
origin git://original/repo.git (fetch)
origin git://original/repo.git (push)
$ git config -l | grep '^remote\.'
remote.origin.url=git://original/repo.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
现在,如果您想使用一个命令推送到两个或多个存储库,您可以创建一个新的名为all的远程(正如@Adam Nelson在评论中所建议的那样),或者继续使用源,尽管后者的名称对这个目的的描述较少。如果仍要使用原点,请跳过以下步骤,在所有其他步骤中使用原点而不是全部。
因此,让我们添加一个名为all的新远程,稍后我们将在推送到多个存储库时引用它:
$ git remote add all git://original/repo.git
$ git remote -v
all git://original/repo.git (fetch) <-- ADDED
all git://original/repo.git (push) <-- ADDED
origin git://original/repo.git (fetch)
origin git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git <-- ADDED
remote.all.fetch=+refs/heads/*:refs/remotes/all/* <-- ADDED
然后,让我们将一个pushurl添加到all remote,指向另一个存储库:
$ git remote set-url --add --push all git://another/repo.git
$ git remote -v
all git://original/repo.git (fetch)
all git://another/repo.git (push) <-- CHANGED
origin git://original/repo.git (fetch)
origin git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git
remote.all.fetch=+refs/heads/*:refs/remotes/all/*
remote.all.pushurl=git://another/repo.git <-- ADDED
这里gitremote-v显示了push的新pushurl,因此如果您执行git push all master,它会将master分支推到git://another/repo.git只有这显示了pushurl如何覆盖默认url(remote.all.url)。
现在,让我们添加另一个指向原始存储库的pushurl:
$ git remote set-url --add --push all git://original/repo.git
$ git remote -v
all git://original/repo.git (fetch)
all git://another/repo.git (push)
all git://original/repo.git (push) <-- ADDED
origin git://original/repo.git (fetch)
origin git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git
remote.all.fetch=+refs/heads/*:refs/remotes/all/*
remote.all.pushurl=git://another/repo.git
remote.all.pushurl=git://original/repo.git <-- ADDED
您可以看到我们添加的两个推送URL都保持不变。现在,一个单位数的push-all-master将把master分支推到两个git://another/repo.git和git://original/repo.git.
重要提示:如果您的遥控器有不同的规则(钩子)来接受/拒绝推送,则一个遥控器可能会接受推送,而另一个则不会。因此,如果您希望它们具有完全相同的历史记录,则需要在本地修复提交,以使它们能够被两个远程设备接受,然后再次推送,否则您可能会陷入只能通过重写历史记录(使用push-f)来修复它的情况,这可能会给已经从repo中删除以前更改的人带来问题。