Нажатие на github после мелкого клона
У меня было массивное репо git из-за огромного количества коммитов, поэтому, следуя советам здесь, я создал мелкий клон. Я внес изменения в это новое местное репо, и теперь я хочу подтолкнуть свое происхождение в Github (а затем к моим промежуточным и производственным пультам на Heroku). Возможно, однажды я научусь читать документацию:
Параметр git clone --depth command говорит
- depth Создайте неглубокий клон с историей, усеченной до указанного количества ревизий. Неглубокий репозиторий имеет число (вы не можете клонировать или извлекать из него, ни в него)
Итак... как я могу освободиться от этой ситуации и подтолкнуть мой код к Github?
Ответы
Ответ 1
Git (начиная с версии 1.8.3) теперь имеет официальный способ получить полную историю мелкого клона:
git fetch --unshallow
Из git fetch документации:
--unshallow
Если исходный репозиторий завершен, преобразуйте неглубокий репозиторий в полный, удалив все ограничения, наложенные неглубокими репозиториями.
Если исходный репозиторий неглубокий, выберите как можно больше, чтобы текущий репозиторий имел ту же историю, что и исходный репозиторий.
Ответ 2
Я не соглашусь с принятым ответом по двум причинам:
- Есть много причин для отказа и забыть файл
- Вы теряете сообщения и историю фиксации
Вот мои предложения:
Графтная точка
У вас должен быть файл $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
Ответ 3
Если вы работаете в неглубоком клоне, и отсутствие истории вызывает проблему, вы можете получить больше истории с помощью опции --depth
.
git fetch --depth=20
Где 20 - сумма фиксации для извлечения. Увеличьте его, если этого недостаточно.
Вы также можете использовать опцию --depth
с git pull
.
Ответ 4
У меня была аналогичная проблема с нажатием мелкого клонирования репо на серверы Bitbucket, и у меня не было доступа к старой истории. Наконец, я нашел решение. См. Образец script с комментариями ниже:
#!/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
Ответ 5
git filter-branch -- --all
git push