项目可以有多个来源吗?

Chr*_*row 152 git github repository

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

我想将一个项目推送到githubHeroku服务器.

具体来说,添加github存储库时会出现此错误:

$ git remote add origin https://github.com/Company_Name/repository_name.git
fatal: remote origin already exists.
Run Code Online (Sandbox Code Playgroud)

mea*_*gar 232

您可以拥有任意数量的遥控器,但只能有一个名为"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
Run Code Online (Sandbox Code Playgroud)

  • 正如对该问题可能重复的问题的最高投票答案所示 - 远程可以引用多个存储库.因此,您*可以*推送到一个远程并更新两个或更多个存储库,但不清楚这是否是OP的目标. (4认同)
  • @mightyspaj几乎所有部署到Heroku的人都有一个名为`origin`的遥控器和一个名为`heroku`的遥控器. (4认同)

Jos*_*ion 79

作为后来绊倒这个问题的人的旁注,有可能一次将原始数据推送到多个git存储库服务器.

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

git remote set-url --add origin ssh://git@bitbucket.org/user/myproject.git
Run Code Online (Sandbox Code Playgroud)

  • 有关这方面的更多想法,请参阅[this quesion](http://stackoverflow.com/a/12795747/1116842). (6认同)
  • @Michael`git remote set-url --delete origin ssh:// git @ bitbucket.org / user / myproject.git` (6认同)
  • 好的,如何删除这些起源之一而不删除所有起源? (2认同)
  • 嘿,有人可以将此标记为正确答案吗? (2认同)

小智 35

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

  1. 为GitHub添加远程仓库

    $ git remote add github https://github.com/Company_Name/repository_name.git
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为GitLab添加远程仓库

    $ git remote add gitlab https://gitlab.com/Company_Name/repository_name.git
    
    Run Code Online (Sandbox Code Playgroud)
  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)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 你如何推动多个存储库?

    $ git push github && git push gitlab
    
    Run Code Online (Sandbox Code Playgroud)

  • 不仅仅是$ git push`推送到所有遥控器吗? (2认同)

Ost*_*PHP 17

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
Run Code Online (Sandbox Code Playgroud)

现在你有 2 个起源。

  • 由于“--push”选项,这个答案比其他答案更有帮助/更精致。 (4认同)

Ann*_*ari 6

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

但是,只能调用这些链接之一origin。其余的链接需要有不同的名称

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

让我用一个例子来解释。

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

在此处输入图片说明

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

如果您运行该命令git remote -v,它将列出链接到本地​​存储库的所有远程存储库。在那里您将看到,为了从远程存储库推送或获取代码,您将使用短名称“origin”。 在此处输入图片说明

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

在此处输入图片说明

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

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

那么,什么是origin

基本上, origin 是当您克隆该远程存储库时 Git 用于远程存储库的默认短名称。所以它只是默认的.

在许多情况下,您将拥有指向本地存储多个远程存储库的链接,并且每个存储库都有不同的短名称。

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

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

在此处输入图片说明

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

有一个非常有用的视频 解释了所有这些,可以在这里找到。


小智 6

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

cd existing_repo
Run Code Online (Sandbox Code Playgroud)

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

git remote rename origin old-origin
Run Code Online (Sandbox Code Playgroud)

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

git remote add origin https://github.com/repository_name.git
Run Code Online (Sandbox Code Playgroud)

现在您可以将代码推送到新的origin遥控器

git push -u origin --all
git push -u origin --tags
Run Code Online (Sandbox Code Playgroud)