Нажатие на github после мелкого клона - программирование
Подтвердить что ты не робот

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

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

Параметр git clone --depth command говорит

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

Итак... как я могу освободиться от этой ситуации и подтолкнуть мой код к Github?

4b9b3361

Ответ 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