Git:将浅克隆推送到一个新的遥控器而不是“不浅的”?

Bri*_*and 2 git

我用git clone --depth=1. 我做了一些改变……显然不了解浅克隆的复杂性……现在想把新项目推到一个新的远程。

在我的主要开发机器上:

git clone --depth=1 file://old_project new_project
cd new_project
# made a handful of commits here....
Run Code Online (Sandbox Code Playgroud)

我现在想将项目推送到另一台机器上。在那个远程机器上我做了:

git init --bare new_project.git
Run Code Online (Sandbox Code Playgroud)

然后回到我的机器上:

git remote remove origin
git remote add origin ssh://<remote host>/path/to/repos/new_project.git
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试push该项目时,我得到:

fatal: protocol error: expected old/new/ref, got 'shallow 7f6a256...'
fatal: The remote end hung up unexpectedly
Counting objects: 49299, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (44533/44533), done.
error: pack-objects died of signal 13
error: failed to push some refs to '<my new remote>'
Run Code Online (Sandbox Code Playgroud)

我想要做的是让新的 repo 包含从初始浅克隆开始的历史记录,但仍然保留在那之后所做的更改。换句话说,我不想“unshallow”分支并拉出所有以前的历史记录。

有没有办法不.git从项目中删除目录并重新开始?

我的机器正在运行 git 1.9.1。遥控器正在运行 1.7.11.7。我可能可以在没有不良影响的情况下更新我的一面,但不能更新遥控器,因为它承载了我不想冒险破坏的其他几个项目。

Leo*_*eon 5

我会这样做:

  1. 创建一个新的根分支:

    git checkout --orphan truncated_master
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用浅层存储库中最早的可用提交填充其初始提交:

    START_COMMIT=$(git rev-list master|tail -n 1)
    git checkout $START_COMMIT -- .
    git commit -m "Initial commit"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将所有提交从 master 复制到新分支:

    git cherry-pick $START_COMMIT..master
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将新分支推送到新的远程:

    git push origin truncated_master:master
    
    Run Code Online (Sandbox Code Playgroud)