将现有的代码仓库推送到一个新的不同的远程仓库服务器,如何操作Git?

718

假设我在 git.fedorahosted.org 上有一个代码库,我想将其克隆到我的github帐户中,以便于在fedorahosted上的官方代码之外拥有自己的“游乐场”。 最初复制这个仓库需要哪些步骤呢? 在github中有这个不错的“fork”按钮,但出于明显的原因我无法使用它。

如何跟踪fedorahosted代码库的更改并同步到github的代码库中?

16个回答

1032
  1. 在GitHub上创建一个新的仓库。
  2. 将仓库从fedorahosted克隆到本地机器。
  3. git remote rename origin upstream
  4. git remote add origin URL_TO_GITHUB_REPO
  5. git push origin master

现在你可以像处理其他GitHub仓库一样使用它。要从上游拉取补丁,只需运行git pull upstream master && git push origin master

GitHub最近将master分支更名为main,所以(根据你的分支是master还是main)在第5步中,你可能需要使用git push origin main,而对于从上游拉取补丁,使用git pull upstream main && git push origin main,否则你将收到错误消息。


33
没有必要重新命名原始起源,只需用另一个名称来称呼新的游乐场。 - tacaswell
48
从技术上讲并不是这样,但通常情况下 origin 是指向官方远程位置的强烈约定。在这种情况下,github 应该是官方位置。 - troelskn
3
也许我应该发表一个不同的问题,但我认为你们正在讨论我想要的内容。我想添加一个新的远程仓库,而不是替换现有的仓库,这样我就可以继续从旧仓库拉取,但将任何更改推送到新仓库。 - ThatAintWorking
19
您应该开一个新问题,简单来说,您可以使用命令git remote add添加任意数量的远程地址。然后,您可以通过在git push时显式声明远程地址来将内容推送到其中一个远程地址。例如,使用命令git push foobar master将当前分支推送到名为foobar的远程地址上的master分支。 - troelskn
4
只推送了主分支,没有推送所有分支。镜像答案适用于所有分支。 - user1114
显示剩余11条评论

157

这个问题中有一个被删除的回答,其中包含一个有用的链接:https://help.github.com/articles/duplicating-a-repository

要点是:

0. create the new empty repository (say, on github)
1. make a bare clone of the repository in some temporary location
2. change to the temporary location
3. perform a mirror-push to the new repository
4. change to another location and delete the temporary location
在你的本地计算机上。
$ cd $HOME
$ git clone --bare https://git.fedorahosted.org/the/path/to/my_repo.git
$ cd my_repo.git
$ git push --mirror https://github.com/my_username/my_repo.git
$ cd ..
$ rm -rf my_repo.git

11
裸克隆和镜像推送相比于简单地添加并推送到另一个远程存储库,有什么好处?是不是所有分支都会被推送而不仅仅是当前分支?(如果是这样,那么这似乎是被接受的答案中应该注意的限制。) - yoyo
3
这正是我在寻找的信息,--bare / --mirror 通常是人们想要执行的操作!这是一个重要的答案!谢谢。 - claf
3
太好了!绝对是关于问题的最正确的答案。谢谢!如果我不这样做,我总是会得到“错误:无法将一些引用推送到'https://github.com/username/testrep.git'”。 - Denis Babarykin

78
为了将您现有的仓库推送到不同的位置,您需要进行以下操作:
  1. 首先克隆原始仓库。

  2. git clone https://git.fedorahosted.org/cgit/rhq/rhq.git
    
  3. 将克隆的源代码推送到您的新存储库:

  4. cd rhq
    git push https://github.com/user/example master:master
    

您可以将master:master更改为source:destination分支。


如果您想要推送特定的提交记录(分支),则执行以下操作:

  1. 在原始代码库上创建并切换到新分支:

git checkout -b new_branch
  • 选择并重置您想要开始的点:

  • git log # Find the interesting hash
    git reset 4b62bdc9087bf33cc01d0462bf16bbf396369c81 --hard
    

    或者使用git cherry-pick选择提交来追加到现有的HEAD中。

  • 然后将其推送到您的新存储库:

  • git push https://github.com/user/example new_branch:master
    

    如果您正在进行变基,请使用-f来强制推送(不建议)。运行git reflog以查看更改历史记录。


    3
    git push ... old_branch_name:new_branch_name 的作用是将一个特性分支从旧仓库推送到新仓库,并将其作为主分支。非常有用! - gorjanz
    这是我做这件事最简单的方式。 - Adam

    64

    如果您已经有现有的Git存储库:

    cd existing_repo
    git remote rename origin old-origin
    git remote add origin https://gitlab.com/newproject
    git push -u origin --all
    git push -u origin --tags
    

    9
    只是为了澄清,--all选项将会推送所有分支。 - GilCol
    2
    非常好,将本地存储库复制到远程的方法非常简单。谢谢。 请确保远程文件夹存在一个git存储库。我在远程服务器上使用了git init --bare命令。 - PaulH
    git push -u origin <branch-name> 只推送该分支 - Animesh Rawat

    33

    我发现使用set-url这个解决方案既简洁易懂

    1. 在Github上创建一个新的仓库
    2. cd进入您本地计算机上的现有仓库(如果您尚未克隆,则需先进行此操作)
    3. git remote set-url origin https://github.com/user/example.git
    4. git push -u origin master

    22

    你是否真的只想将本地仓库(包括本地分支等)推送到新的远程仓库,还是你真的想在新的远程仓库上镜像旧的远程仓库(包括所有分支、标签等)?如果是后者,这篇博客会给你提供非常好的指导:如何正确地镜像一个Git仓库

    我强烈建议你阅读这篇博客以获取一些非常重要的细节,但简要概述如下:

    在一个新的目录中运行以下命令:

    git clone --mirror git@example.com/upstream-repository.git
    cd upstream-repository.git
    git push --mirror git@example.com/new-location.git
    

    我认为这是链接:http://blog.plataformatec.com.br/2013/05/how-to-properly-mirror-a-git-repository/ - David

    16

    尝试这个:如何移动完整的Git存储库

    1. 使用以下命令在temp-dir目录中创建本地存储库:

      git clone temp-dir

    2. 进入temp-dir目录。

    3. 要查看ORI中不同分支的列表,请执行以下操作:

      git branch -a
      
    4. 使用以下命令检出想要从ORI复制到NEW的所有分支:

    5. git checkout branch-name
      
    6. 现在使用以下代码从 ORI 获取所有标签:

      git fetch --tags
      
    7. 在执行下一步之前,请使用以下命令检查您的本地标签和分支:

    8. git tag
      
      
      git branch -a
      
    9. 现在使用以下命令清除到 ORI 存储库的链接:

    10. git remote rm origin
      
    11. 现在使用以下命令将您的本地存储库链接到新创建的NEW存储库:

    12. git remote add origin <url to NEW repo>
      
      现在使用以下命令推送您的所有分支和标签:
    13. 现在使用以下命令推送您的所有分支和标签:

      git push origin --all
      
      
      git push --tags
      
    14. 您现在拥有来自您的ORI仓库的完整副本。


    我喜欢这个工具,因为它帮助我复制了一个特定分支子集的repo,其中一些是多余的。我注意到使用GitHub的repo可以自动为每个非默认分支创建PR,并且你只需关闭它们;不确定是否可能阻止PR的出现。 - learning2learn

    16

    只需使用此命令更改GIT存储库URL,即可指向新的存储库:

    git remote set-url origin [new repo URL]
    

    示例: git remote set-url origin git@bitbucket.org:Batman/batmanRepoName.git

    现在,推送和拉取将链接到新的存储库。

    然后像这样正常推送:

    git push -u origin master
    

    7

    这帮助我将本地项目推送到Git的另一个存储库。

     git push https://github.com/yourusername/yourgithubproject.git master:master
    

    整洁的;简洁的;可用的;简单的 - soMuchToLearnAndShare

    5

    首先,在Github上创建您的仓库。然后更改目录到已检出的源代码仓库 - 假设您想要推送master分支。您需要执行5个简单的步骤:

    git remote add origin2 https://github.com/user/example.git
    git checkout master
    git pull
    git push origin2 master
    git remote remove origin2
    

    这将创建您的本地repo与新远程之间的链接,检出并拉取源分支(以确保它是最新的),然后推送当前分支,最后取消本地repo与远程之间的链接。

    此操作完成后,您的本地repo将完好无损,可以像以前一样使用。如果您需要推送多个分支,请根据需要重复checkout-pull-push步骤,并相应更改分支名称。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接