在浅克隆之后推送到github

时间:2012-07-07 12:38:51

标签: git heroku github shallow-clone

由于提交的数量很多,我有一个庞大的git repo,所以按照建议here我创建了一个浅层克隆。我已经对这个新的本地仓库进行了更改,现在我想在Github上推动我的起源(然后再到我在Heroku上的升级和生产遥控器)。也许有一天我会学习阅读文档:

  

git clone --depth命令选项说

     

- depth创建一个浅层克隆,其历史记录被截断为指定的修订版本数。浅存储库有一个数字   限制(你不能克隆或获取它,也不能推动也不是   进入它)

那么......我如何从这种情况中解脱出来并将我的代码推送到Github?

5 个答案:

答案 0 :(得分:14)

我不同意接受的答案有两个原因:

  1. 失败并忘记文件的原因有很多
  2. 您丢失了提交消息和历史记录
  3. 以下是我的建议:

    移植点

    你应该有一个带有嫁接点的$ GIT_DIR / .git /浅文件。如果历史很简单,即使文档另有说明,这个移植点应该允许你推动。

    补丁

    这允许您保留提交历史记录等:

    git format-patch origin..master
    

    然后克隆原点并重新申请:

    git clone origin_path
    cp shallow_clone/*.patch deep_clone
    cd deep_clone
    git am *.patch
    

    这次你可以推!

    git push
    

答案 1 :(得分:12)

Git(从1.8.3开始)现在有了一种正式的方法来获取浅层克隆的完整历史记录:

git fetch --unshallow

来自git fetch documentation

  

--unshallow

     

如果源存储库已完成,请将浅存储库转换为完整存储库,从而消除浅存储库所施加的所有限制。

     

如果源存储库很浅,请尽可能多地获取,以便当前存储库与源存储库具有相同的历史记录。

答案 2 :(得分:8)

如果您在浅层克隆中工作并且缺少历史记录会导致问题,您可以使用--depth选项获取更多历史记录。

git fetch --depth=20

其中20是要获取的提交量。如果还不够,请增加它。

您还可以将--depth选项与git pull一起使用。

答案 3 :(得分:3)

我有一个类似的问题,将浅克隆回购推送到Bitbucket服务器,我没有访问旧历史记录。最后,我找到了解决方案。请参阅下面带有注释的示例脚本:

#!/bin/bash

# Fix shallowness
mv .git/shallow .git/info/grafts

git checkout --orphan temp # create temp empty commit
git reset --hard
git commit -m "Init" --allow-empty

# Replace all shallow commits ids with new commit id. I copy-paste all refs from shallow file 
git replace 196cdbdb30e608aae2fd7cbe97cc8c0e6fa66c06 <commit_id_of_empty_init_above>
git replace 4c645849b296aaafc1809a9e1537c0fb305167ad <commit_id_of_empty_init_above>
git replace 50eab8bd8c416c47354331211b1efd8688ad8e97 <commit_id_of_empty_init_above>
git replace 649dc7577b87d1b05dff05bf9adc5e46f6612dfa <commit_id_of_empty_init_above>
git replace 6902148fde7b98ff0d6b6c6ebe929590322c95ff <commit_id_of_empty_init_above>
git remote set-url origin http://<username>:<password>@<example.com:port/repo.git> # reference to a remote repo to push
git push origin 'refs/replace/*' # push replace refs to remote repo first
git push -u origin master # push to master, finally

# Clear some garbage just in case
git filter-branch --tag-name-filter cat -- --all # rewrite history
git push --force origin
git fsck # check that everything is ok

答案 4 :(得分:3)

选项1) 如果您仍然拥有原始仓库,只需在推送之前从中获取:

git fetch --unshallow

选项2) 当心!这仅建议用于新的回购,因为 WILL 会导致历史记录丢失,并且极易发生冲突!

如果您已经删除了从中获取的存储库, 你需要丢弃所有历史记录。

 git filter-branch -- --all
 git push

git filter-branch:允许您重写Git修订历史记录

--:将过滤器分支选项与修订选项分开

--all:重写所有分支和标签