【问题标题】:Can a project have multiple origins?一个项目可以有多个来源吗?
【发布时间】:2012-07-26 07:17:04
【问题描述】:

一个项目在 Git 中可以有两个(或更多)“起源”吗?

我想将一个项目推送到github 和Heroku 服务器。

具体是在添加github仓库的时候出现这个错误:

$ git remote add origin https://github.com/Company_Name/repository_name.git
fatal: remote origin already exists.

【问题讨论】:

  • 您可以拥有任意数量的远程存储库,但您必须为它们指定不同的名称。
  • 在这种情况下存储库名称不同。 “起源”这个词是可以更改的名称吗?
  • 是的,git remote rename <old> <new>:linux.die.net/man/1/git-remote。但是你也可以用不同的方式命名 Github 存储库...
  • 是否可以将其中一个遥控器设为默认遥控器,这样我每次推送时都不会被要求明确写出该遥控器的名称?

标签: git github repository


【解决方案1】:

您可以拥有任意数量的遥控器,但您只能拥有一个名为“origin”的遥控器。名为“origin”的远程没有任何特殊之处,只是它是 Git 在克隆现有存储库时创建的默认远程。您可以配置第二个远程,从该远程推送/拉取,并设置一些分支以跟踪来自该远程而不是源的分支。

尝试添加一个名为“github”的遥控器:

$ git remote add github https://github.com/Company_Name/repository_name.git

# push master to github
$ git push github master

# Push my-branch to github and set it to track github/my-branch
$ git push -u github my-branch

# Make some existing branch track github instead of origin
$ git branch --set-upstream other-branch github/other-branch

【讨论】:

  • 正如对这个问题可能重复的问题投票最高的答案所示 - 远程可以引用多个存储库。因此,您可以推送到一个远程并更新两个或更多存储库,但不清楚这是否是 OP 的目标。
  • 有哪些实际示例可以说明您为什么要这样做?为什么会有一个目录指向多个存储库?每个存储库通常都有自己的专用目录
  • @mightyspaj 几乎每个部署到 Heroku 的人都有一个名为 origin 的遥控器和一个名为 heroku 的遥控器。
  • @mightyspaj,或者如果您的团队正在使用分叉并且您有时想要访问它们。我们在我们的团队中与不同 UTC 的团队合作,这样当我们批准 PR 时,我们可以使用那里的 fork 代表那里 rebase/push 并且能够现在合并代码,而不是明天)。
  • 有没有办法一次将所有本地分支推送到新的远程?
【解决方案2】:

对于以后遇到此问题的任何人来说,附带说明一下,可以一次将源推送到多个 git 存储库服务器。

您可以通过使用以下命令将另一个 URL 添加到源远程来实现此目的。

git remote set-url --add origin ssh://git@bitbucket.org/user/myproject.git

【讨论】:

  • 关于这方面的更多想法,请参阅this quesion。
  • 好的,那么如何在不删除所有来源的情况下删除其中一个来源?
  • @Michael 您可以编辑./git/config 文件并删除 [remote "origin"] 部分下的 url 文件
  • @Michael git remote set-url --delete origin ssh://git@bitbucket.org/user/myproject.git
  • 必须所有遥控器都具有相同的提交历史吗?如果我想将某些提交推送到一个远程而不是另一个,该怎么办
【解决方案3】:

这是一个包含多个遥控器、GitHub 和 GitLab 的示例项目:

  1. 为 GitHub 添加远程仓库

    $ git remote add github https://github.com/Company_Name/repository_name.git
    
  2. 为 GitLab 添加远程仓库

    $ git remote add gitlab https://gitlab.com/Company_Name/repository_name.git
    
  3. 现在项目中有多个遥控器。仔细检查git remote -v

    $ git remote -v
    github https://github.com/Company_Name/repository_name.git (fetch)
    github https://github.com/Company_Name/repository_name.git (push)
    gitlab https://gitlab.com/Company_Name/repository_name.git (fetch)
    gitlab https://gitlab.com/Company_Name/repository_name.git (push)
    
  4. 如何推送到多个存储库?

    $ git push github && git push gitlab
    

【讨论】:

  • 不会只是$ git push 推送到所有遥控器吗?
  • 当我尝试推送 github 然后自动推送到 gitlab 时出现问题。你能帮帮我吗?我要一一推送原点。
  • 如果我在 gitlab 中有两个项目,两个存储库,我该如何处理。我从一个项目中获取代码,然后将其推送到另一个项目?
【解决方案4】:

您可以通过提供不同的名称而不是来源来将另一个远程帐户添加到您的存储库。您可以使用名称,例如 origin2。 所以你的 git 命令可以修改为

git remote add origin2 https://github.com/Company_Name/repository_name.git

【讨论】:

    【解决方案5】:
    git remote add origin2 https://github.com/Company_Name/repository_name.git
    

    用于推送:

    git push -u origin2 master
    

    【讨论】:

      【解决方案6】:
      git remote set-url --add --push origin git@github.com:user/my-project.git
      git remote set-url --add --push origin git@bitbucket.org:user/my-project.git
      

      现在你有 2 个起源。

      【讨论】:

      • 由于--push 选项,此答案比其他答案更有帮助/完善。
      • 这正是我想要的。从旧原点拉取,但为了备份目的推送到新原点!
      【解决方案7】:

      一个本地存储库可以链接到多个远程存储库。

      但是,只有其中一个链接可以称为origin。其余链接需要有不同的名称。

      因此,为了正确回答这个问题,我们需要了解起源是什么。

      让我用一个例子来解释。

      假设您有一个名为amazing-project 的remote repository,然后您将该远程存储库克隆到您的本地计算机,以便您拥有一个local repository。然后你会得到如下图所示的内容:

      因为您克隆了存储库。远程存储库和本地存储库链接。

      如果您运行命令git remote -v,它将列出链接到本地​​存储库的所有远程存储库。在那里,您将看到为了从远程存储库推送或获取代码,您将使用 shortname 'origin'。

      现在,这可能有点令人困惑,因为在 GitHub(或远程服务器)中,该项目称为“amazing-project”。那么为什么看起来远程仓库有两个名字呢?

      我们的存储库的名称之一是它在 GitHub 或某个远程服务器上的名称。这可能有点像项目名称。在我们的例子中,这就是“惊人的项目”。

      我们的存储库的另一个名称是它在我们的本地存储库中具有的与存储库的 URL 相关的 shortname。每当我们想从该远程存储库推送或获取代码时,我们将使用它的简称。这种短名称就像 url 的 alias,这是我们避免使用整个长 url 来推送或获取代码的一种方式。在我们上面的例子中,它被称为origin。

      那么,origin是什么?

      基本上,来源是 Git 在克隆远程存储库时用于远程存储库的 默认 短名称。所以它只是默认。

      在许多情况下,您的本地存储库中会有多个远程存储库的链接,每个存储库都有不同的短名称。

      那么最后一个问题,我们为什么不使用相同的名称?

      我将用另一个例子来回答这个问题。假设我们有一个朋友分叉了我们的远程存储库,以便他们可以在我们的项目上帮助我们。假设我们希望能够从他们的远程存储库中获取代码。我们可以使用命令git remote add <shortname> <url> 在我们的本地存储库中添加指向他们远程存储库的链接。

      在上图中,您可以看到我使用短名称friend 来引用我朋友的远程存储库。您还可以看到两个远程存储库具有相同的项目名称amazing-project,这就是为什么远程服务器中的远程存储库名称和我们本地存储库中的短名称不应该相同的一个原因!

      有一个非常有用的video?解释了所有这些,可以找到here。

      【讨论】:

        【解决方案8】:

        你可以使用 代替 origin 使用 GitHub 或 GitLab

        对于 github 代替原点使用 github

        git remote add github https://github.com/repository_name.git
        git push github branchname
        

        对于 gitlab 代替原产地使用 gitlab

        git remote add gitlab https://github.com/repository_name.git
        git push gitlab branchname
        

        【讨论】:

        • 这太完美了
        【解决方案9】:

        您可以按照以下步骤将更改从现有存储库推送到新的远程。

        cd existing_repo
        

        重命名您当前的遥控器(可选)

        git remote rename origin old-origin
        

        添加新的遥控器(此处使用原点)

        git remote add origin https://github.com/repository_name.git
        

        现在您可以将代码推送到新的origin 远程

        git push -u origin --all
        git push -u origin --tags
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-10
          • 2011-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多