由于提交的数量很多,我有一个庞大的git repo,所以按照建议here我创建了一个浅层克隆。我已经对这个新的本地仓库进行了更改,现在我想在Github上推动我的起源(然后再到我在Heroku上的升级和生产遥控器)。也许有一天我会学习阅读文档:
git clone --depth命令选项说
- depth创建一个浅层克隆,其历史记录被截断为指定的修订版本数。浅存储库有一个数字 限制(你不能克隆或获取它,也不能推动也不是 进入它)
那么......我如何从这种情况中解脱出来并将我的代码推送到Github?
答案 0 :(得分:14)
我不同意接受的答案有两个原因:
以下是我的建议:
你应该有一个带有嫁接点的$ 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
--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
:重写所有分支和标签