Нажав на github после мелкого клона
У меня было огромное git-репо из-за огромного количества коммитов, поэтому, следуя совету, я создал неглубокого клона. Я внес изменения в этот новый локальный репозиторий, и теперь я хочу перенести свое происхождение в Github (а затем и на свои промежуточные и производственные пульты на Heroku). Возможно, однажды я научусь читать документацию:
Опция команды git clone --depth говорит
--depth Создать мелкий клон с историей, усеченной до указанного количества ревизий. У мелкого репозитория есть ряд ограничений (вы не можете клонировать или извлекать из него, ни толкать, ни в него)
Итак... как мне выбраться из этой ситуации и отправить свой код на Github?
6 ответов
В Git (начиная с 1.8.3) теперь есть официальный способ получить полную историю мелкого клона:
git fetch --unshallow
--unshallow
Если исходный репозиторий завершен, преобразуйте неглубокий репозиторий в полный, снимая все ограничения, налагаемые неглубокими репозиториями.
Если исходный репозиторий неглубокий, извлеките как можно больше, чтобы текущий репозиторий имел ту же историю, что и исходный репозиторий.
Я не согласен с принятым ответом по 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). Он по-прежнему будет терпеть неудачу при переходе на устаревшую вилку, которая старше вашей истории.
(Кроме того: к сожалению, копирование/вставка является рекомендуемым способом продвижения комментария к ответу)