做空者:有没有一种方法可以让git回购推送到远程回购列表(而不是一个单一的“来源”)中并从中提取?

长篇大论:当我在多台电脑上开发一个应用程序时,我经常会遇到这样的情况,这些电脑具有不同的连接能力——比如,一台笔记本电脑在运输途中,一台电脑“a”在某个位置,另一台电脑则“B”在另一台位置。此外,笔记本电脑可能只与“A”或“B”连接,有时两者都连接。

我希望git始终“拉”到它当前可以连接的所有计算机,这样从一台机器跳到另一台机器,继续无缝工作就更容易了。


当前回答

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

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

其他回答

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

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

自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.

我将两个单独的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"

在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中删除以前更改的人带来问题。

您可以使用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的简写(实际上,它在配置文件中查找以确定这一点,但您可以理解)。

对于推送更新,您必须手动对每个回购进行推送。我认为,推送是在考虑中央存储库工作流的情况下设计的。