如何从现有的Git仓库创建一个新的Git仓库

99
我有一个远程git仓库,它真正替代了我们在另一个旧的SCM中拥有的一切。多年来,许多项目和产品都已添加到该仓库中。
在这个仓库中有一个分支,对应我感兴趣的一个产品。 我想从仅此分支创建一个全新的git仓库,不太关心历史记录的丢失。
git remote add是解决方案吗?我希望这两个仓库都在同一服务器上。
你有什么想法?
5个回答

104
为了从现有仓库创建一个新的Git仓库,通常会创建一个新的仓库,并将现有仓库中的一个或多个分支推送到新仓库。
以下步骤说明了该过程:
  1. 创建一个新的仓库。它必须是的,以便您可以将内容推送到其中。

$ mkdir /path/to/new_repo
$ cd /path/to/new_repo
$ git --bare init

注意: 确保您的新存储库可以从现有存储库访问。 有很多方法可以做到这一点;让我们假设您已经通过 ssh://my_host/new_repo 使其可访问。

  • 从现有存储库推送一个分支。例如,假设我们想要从现有存储库推送分支topic1并将其命名为新存储库中的master

  • $ cd /path/to/existing_repo
    $ git push ssh://my_host/new_repo +topic1:master
    该技术使您可以保留现有分支的历史记录。
    注意:新存储库实际上是一个新的远程存储库。如果您想使用新存储库,请克隆它。以下命令将新存储库克隆到名为new_repo的本地工作目录中:
    $ git clone ssh://my_host/new_repo
    

    在这个例子中,当你克隆新的存储库时,您会发现master分支是旧存储库的topic1分支的副本。


    12
    如果你会经常往远程仓库推送代码,建议使用git remote add origin ssh://my_host/new_repo来添加远程仓库的地址。这样你就可以直接使用git push origin [分支名]进行推送了。 在使用 UNC 路径(例如 Windows 共享文件)时,请确保使用以下方式添加远程仓库地址:git remote add origin "//server_name/myapp/" - chris polzer
    新的代码库能否作为本地目录/代码库访问?是否有更新方法可以实现这一点? - Nikos Alexandris
    @NikosAlexandris 我已添加新的信息,希望能有所帮助。同时请注意,新的仓库位于远程服务器上并不重要。在示例中,我们使用 ssh 协议进行推送和克隆;但是我们也可以使用 file 协议,这将在同一文件系统上创建新的存储库。 - pestrella
    不得不使用 -f 强制推送。无论如何,这个解决方案起作用了。非常感谢。 - Kasun

    26

    像平常一样拉取分支,然后使用 git init 创建一个新的仓库,并将该分支推送到新的仓库中。你需要使用类似以下的代码:

    git push url:///new/repo.git TheBranchFolder
    

    如果这是情况有利的话,该方法还会保留您之前做出的所有更改。


    我正在使用SSH访问我的存储库,我可以使用它来代替您的响应中的URL吗? - reza
    Reza:是的,把 SSH URL 看作是一种不同类型的 URL。 - amcnabb
    在git服务器上,我已经发出了git push /home/git/newBranchGIT branchname的命令...现在我看到的是一个包含我需要的所有内容的git repo,但唯一的分支现在叫做branchname而不是origin或master。我想让branchname成为master。还是有更好的方法吗? - reza
    只需更改名称并提交即可。 - JustinDoesWork
    如果你在 Git Hub 上创建了一个全新的代码库,并且还没有对其进行任何操作,而且默认视图建议使用 git 命令开始操作。那么你可以使用上述命令,而无需指定 'TheBranchFolder'。例如:'git push url:///new/repo.git' - phildn

    26

    如果您不担心失去历史记录,可以执行 git checkout mybranch ,然后将目录内容复制到另一个文件夹中。在该文件夹内,删除 .git 文件夹,然后:

    git init; git commit -a -m "Imported from project Y"
    

    2
    这会保留原始仓库的提交历史记录吗? - Mike Graf
    24
    不,正如答案的第一句话中指出的那样:“如果您不担心失去历史记录……” - Justin ᚅᚔᚈᚄᚒᚔ
    2
    你可能还需要删除/编辑.gitignore文件,否则上述命令在提交时会留下一些可能很重要的文件。 - Dave

    5
    我不知道我的回答是否有所帮助,但这是使用现有存储库创建新存储库的另一种方法。
    步骤1:克隆现有的存储库。
    步骤2:删除克隆存储库文件夹中的.git文件夹。
    步骤3:在Git中创建一个新的存储库。
    步骤4:在克隆的存储库文件夹中运行git init
    步骤5:git add .
    步骤6:git remote add origin NEW_REPO/URL
    步骤7:git branch -M "branch_name"
    步骤8:git push --set-upstream origin branch_name

    1

    我们的计算环境要求在远程服务器上创建git仓库,因此git init不是一个好的选择。我选择了这个方法。

    git clone <NEW, EMPTY REPO> new
    git clone <EXISTING REPO> old
    cd new
    git remote add --no-tags -f old_repo ../old
    git checkout -b main old_repo/main
    git push origin main
    

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