21

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

git clone --depth 命令选项说

--depth 创建一个浅克隆,其历史被截断为指定的修订数。浅层存储库有许多限制(您不能克隆或从中获取,也不能从中推送或进入)

那么......我如何才能摆脱这种情况并将我的代码推送到 Github?

4

5 回答 5

15

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

git fetch --unshallow

git fetch 文档中:

--unshallow

如果源存储库是完整的,则将浅存储库转换为完整存储库,消除浅存储库施加的所有限制。

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

于 2016-03-21T05:18:26.393 回答
14

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

  1. 失败和忘记文件的原因有很多
  2. 您丢失了提交消息和历史记录

以下是我的建议:

移植点

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

补丁

这使您可以保留提交历史记录等:

git format-patch origin..master

然后克隆原点并重新应用:

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

这次可以推了!

git push
于 2012-07-08T08:50:32.733 回答
8

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

git fetch --depth=20

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

您也可以将--depth选项与git pull.

于 2012-08-06T19:32:30.403 回答
4

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

git fetch --unshallow

选项 2) 当心!这仅推荐用于新的回购,因为这导致历史丢失,并且很容易发生冲突!

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

 git filter-branch -- --all
 git push

git filter-branch: 让你重写 Git 修订历史

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

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

于 2017-08-21T10:13:26.573 回答
3

我在将浅克隆 repo 推送到 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
于 2015-10-26T13:34:42.340 回答