Git:将浅克隆推送到没有'unshallow'的新遥控器?

时间:2016-07-08 21:04:40

标签: git

我使用git clone --depth=1对存储库进行了浅层克隆。我做了一些改变......显然没有理解浅层克隆的复杂性......现在想把新项目推到新的遥控器上。

在我的主设备上:

git clone --depth=1 file://old_project new_project
cd new_project
# made a handful of commits here....

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

git init --bare new_project.git

然后回到我的机器上:

git remote remove origin
git remote add origin ssh://<remote host>/path/to/repos/new_project.git

现在,当我尝试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>'

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

如果没有从项目中删除.git目录并重新开始,是否有前进的方法?

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

2 个答案:

答案 0 :(得分:3)

我会这样做:

  1. 创建新的根分支:

    git checkout --orphan truncated_master
    
  2. 使用浅存储库中最早的可用提交填充其初始提交:

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

    git cherry-pick $START_COMMIT..master
    
  4. 将新分支推送到新远程:

    git push origin truncated_master:master
    

答案 1 :(得分:0)

Why can't I push from a shallow clone?似乎还有一些额外的评论。事实上,看看这个评论:

2015年更新:使用Git 2.5+,您甚至可以获取一次提交。请参阅&#34;从远程git存储库中提取特定提交&#34;

所以也许你不能推,但从另一方面,你可以拉。你试过了吗?