2016-07-08 124 views
1

我做了一個與git clone --depth=1存儲庫淺表克隆。我做了一些改變...顯然沒有理解淺層克隆的複雜性......現在想把新項目推到一個新的遠程。Git:將淺層克隆推送到沒有「unshallow」的新遠程?

在我的主要開發機器:

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>' 

我」什麼d喜歡做的是讓新的回購包含最初淺層克隆的歷史,但仍保留此點之後所做的更改。換句話說,我不想「分手」,並拉動所有以前的歷史。

如果沒有從項目中刪除.git目錄並重新開始,是否有一種方法?

我的機器正在運行git 1.9.1。遙控器正在運行1.7.11.7。我可以更新我的身邊沒有不良影響,但不是遠程,因爲它承載了我不想冒險干擾的其他項目。

+0

我並沒有把它作爲一個真正的答案,因爲它太過於推測,但我*認爲* 1.7.11.7和1.9.1之間的淺克隆支持的變化會在這裏失敗。在某些情況下,你可以製作'.git'目錄的tarball,直接拷貝它,完全繞過Git,做你想做的事。 – torek

回答

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. 將所有提交從主分支複製到新分支:

    git cherry-pick $START_COMMIT..master 
    
  4. 推新分支新的遠程:

    git push origin truncated_master:master 
    
+0

下次我不得不這樣做。我放棄了,做了快而骯髒的'rm -f .git; git init; git add .'。 –

+0

這對我有幫助。謝謝! – qznc

0

Why can't I push from a shallow clone?似乎有一些額外的評論。事實上,看看這個評論:

更新2015年:與Git 2.5 +,你甚至可以獲取一個提交。請參閱「從遠程git存儲庫中提取特定提交」

因此,也許你不能推動,但從另一側,你可以拉動。你嘗試過嗎?

+0

是的,我試了一下。我得到了同樣的錯誤,關於不能拉一個淺層克隆。 –