我们是否可以从现有的本地仓库重新克隆一个git仓库?

8
由于Git是一种分布式版本控制系统,因此它应该具有对存储库所做更改的完整历史记录。
那么我们可以提取最初克隆的存储库版本吗?
实际上,我已经在现有的本地存储库中进行了很多更改。我不想通过丢失数据来恢复到原始状态。但我想使用现有的Git对象(blob / tree)将原始存储库(最初克隆的存储库)提取到其他位置。
注意:我现在无法访问Git服务器。
5个回答

4

试试这个:

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 可能不知道您最初克隆的是哪个修订版本,但您可能可以找出来)。第一步只是将本地磁盘上的工作副本克隆到另一个目录中,以便您可以保留现有的工作副本不受影响。


2
如果我理解正确,您从远程仓库克隆了项目(称为本地仓库-local_repo_1),之后对其进行了一些更改(未提交),现在您想要另一个原始克隆git仓库的副本,但是从local_repo_1而不是从远程仓库开始。
您可以按照以下步骤执行:
  1. 将您的工作保存到暂存区
    git stash save stash_name //给您的stash命名,比如说local_repo_2

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

  3. 最后,您可以返回到您的local_repo_1并应用您的stash
    git stash apply

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

1
您可以将此脚本添加到您的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
}

0

是的,你绝对可以做到。

试试这个:

假设你已经克隆到

c:/originalRepository

切换到一个新文件夹并说

git clone file:///c:/originalRepository

你将会拥有之前克隆的代码库。


@MichaelVer 如果需要原始状态,我们需要将分支切换到之前需要的提交或进行reset --hard。这与服务器相同。如果git服务器上有新的提交,而您希望代码回退到以前的提交,则以上操作可以帮助从现有存储库创建一个包含最新提交的新存储库。 - Vinay Veluri

-2

你可以创建一个新的分支

git checkout -b original-state REV

原帖作者想要克隆他的本地存储库,但这并不能实现,也无法真正解决实际问题。 - user456814
@Cupcake 这完全取决于具体情况。我理解这个问题是关于在Git中查看和管理过去的版本。当然,可以创建现有存储库的其他实例,从而得到具有不同修订版本的多个文件夹。但我认为这不是最佳实践。 - Michael Ver
如果能提供更多相关的解释,那么这个答案将会更好。 - user456814

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