Нажав на github после мелкого клона

У меня было огромное git-репо из-за огромного количества коммитов, поэтому, следуя совету, я создал неглубокого клона. Я внес изменения в этот новый локальный репозиторий, и теперь я хочу перенести свое происхождение в Github (а затем и на свои промежуточные и производственные пульты на Heroku). Возможно, однажды я научусь читать документацию:

Опция команды git clone --depth говорит

--depth Создать мелкий клон с историей, усеченной до указанного количества ревизий. У мелкого репозитория есть ряд ограничений (вы не можете клонировать или извлекать из него, ни толкать, ни в него)

Итак... как мне выбраться из этой ситуации и отправить свой код на Github?

6 ответов

Решение

В Git (начиная с 1.8.3) теперь есть официальный способ получить полную историю мелкого клона:

git fetch --unshallow

Из документации git fetch:

--unshallow

Если исходный репозиторий завершен, преобразуйте неглубокий репозиторий в полный, снимая все ограничения, налагаемые неглубокими репозиториями.

Если исходный репозиторий неглубокий, извлеките как можно больше, чтобы текущий репозиторий имел ту же историю, что и исходный репозиторий.

Я не согласен с принятым ответом по 2 причинам:

  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

Если вы работаете в мелком клоне, и отсутствие истории вызывает проблему, вы можете получить больше истории с помощью --depth вариант.

git fetch --depth=20

Где 20 - количество коммитов для выборки. Увеличьте его, если этого недостаточно.

Вы также можете использовать --depth вариант с git pull,

Вариант 1) Если у вас все еще есть оригинальный репо, просто извлеките его, прежде чем нажать:

git fetch --unshallow

Вариант 2) ВНИМАНИЕ! это рекомендуется только для новых репозиториев, так как это приведет к потере истории, а также очень подвержено конфликтам!!

Если вы уже удалили репозиторий, из которого извлекали данные, вам нужно удалить всю историю с помощью.

 git filter-branch -- --all
 git push

git filter-branch: Позволяет переписать историю изменений Git

--: отделяет параметры ветви фильтра от параметров ревизии

--all: переписать все ветки и теги

У меня была похожая проблема с переносом мелкого репозитория клонов на серверы 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

От @nschum

Для справки в будущем: git теперь поддерживает отправку из неглубоких клонов (начиная с версии 1.9). Он по-прежнему будет терпеть неудачу при переходе на устаревшую вилку, которая старше вашей истории.

(Кроме того: к сожалению, копирование/вставка является рекомендуемым способом продвижения комментария к ответу)

Другие вопросы по тегам