【问题标题】:Can we reclone a git repository from the existing local repository我们可以从现有的本地存储库中重新克隆一个 git 存储库吗
【发布时间】:2014-04-13 03:21:50
【问题描述】:

由于 git 是分布式 VCS,它应该具有对存储库所做更改的完整历史记录。

那么我们可以提取首先克隆的那个版本的 repo 吗?

实际上,我在现有的本地仓库中做了很多更改。并且不想通过丢失数据恢复到原始状态。但我想使用现有的 git 对象(blob/tree)将原始存储库(我最初克隆的)提取到其他位置。

注意:我现在无法访问 git 服务器。

【问题讨论】:

    标签: git git-clone git-revert


    【解决方案1】:

    是的,你绝对可以做到。

    试试这样的

    假设你已经克隆到

    c:/originalRepository
    

    切换到新文件夹并说

    git clone file:///c:/originalRepository
    

    您将拥有之前克隆的 repo。

    【讨论】:

    • @MichaelVer 如果需要原始状态,我们需要将分支切换到我们需要的提交,或者重置 --hard。它与服务器相同。如果 git 服务器中有新的提交,并且您希望代码在以前的提交中!以上有助于从现有的仓库创建一个新的仓库,提交是最新的。
    【解决方案2】:

    试试这个:

    git clone SOURCE_PATH NEW_PATH # clones everything you have committed up to now
    cd NEW_PATH                    # go to new clone, don't modify the pre-existing one
    git reset --hard REV           # REV is the revision to "rewind" to (from git log)
    

    因此,您需要明确确定要返回到哪个修订版(Git 可能不知道您最初克隆的是哪个修订版,但也许您可以弄清楚)。第一步只是从本地磁盘克隆到不同目录中的本地磁盘,这样您就可以保持现有工作不受影响。

    【讨论】:

      【解决方案3】:

      你可以新建一个分支

      git checkout -b original-state REV
      

      【讨论】:

      • 原发帖者想克隆他的本地repo,这不会这样做,它并不能真正解决实际问题。
      • @Cupcake 这一切都取决于。我读这个问题更像是在 Git 中查看和管理过去的版本。当然,您可以创建现有存储库的其他实例,最终以多个具有不同修订版本的文件夹结尾。我只是认为这不是最佳做法。
      • 对此效果的更多解释将使这成为一个更好的答案。
      【解决方案4】:

      如果我理解正确,您从远程仓库克隆了您的项目(调用本地仓库 - local_repo_1),之后您对其进行了一些更改(未提交),现在您想要另一个原始副本克隆 git repo,但来自 local_repo_1 而不是来自远程。

      您可以按照以下步骤执行此操作:

      1. 将您的工作保存在存储中
        git stash save stash_name //give any name to your stash, say local_repo_2

      2. 现在您只剩下从远程克隆的裸仓库了,您可以通过以下方式克隆它:
        从你的 git 仓库移出
        cd ..
        克隆
        git clone /path/to/local_repo_1 local_repo_2 // local_repo_2 is the new repo
        如果您也有一些本地提交,请执行 a
        git log
        并将其重置为所需的 SHA
        git reset --hard SHA

      3. 最后你可以回到你的local_repo_1并应用你的存储
        git stash apply

      瞧,现在您有了:
      local_repo_1:您对裸仓库所做的更改,恢复到其原始形式。
      local_repo_2:没有本地更改的远程仓库副本

      【讨论】:

        【解决方案5】:

        您可以将此脚本添加到您的 bash 中

        reclone () {
            set -e
            basename=${PWD##*/}
            remoteurl=$(git remote get-url --push origin)
            cd ..
            echo $basename
            echo $remoteurl
            rm -rf $basename
            git clone $remoteurl
            cd $basename
            set +e
        }
        

        【讨论】:

          最近更新 更多