change - github commands
Empujando a github después de un clon poco profundo (5)
Git (desde 1.8.3) ahora tiene una forma oficial de obtener la historia completa de un clon poco profundo:
git fetch --unshallow
Desde la documentación de git fetch :
--unshallow
Si el repositorio de origen está completo, convierta un repositorio poco profundo en uno completo, eliminando todas las limitaciones impuestas por los repositorios poco profundos.
Si el repositorio de origen es poco profundo, busque la mayor cantidad posible para que el repositorio actual tenga el mismo historial que el repositorio de origen.
Tuve un repositorio de git masivo debido a una gran cantidad de confirmaciones, por lo que siguiendo los consejos here , creé un clon superficial. Hice cambios en este nuevo repositorio local, y ahora quiero forzar mi origen en Github (y luego a mis controles remotos de montaje y producción en Heroku). Quizás algún día aprenderé a leer la documentación:
La opción de comando git clone --depth dice
--depth Crea un clon de poca profundidad con un historial truncado al número especificado de revisiones. Un repositorio poco profundo tiene una serie de limitaciones (no se puede clonar ni recuperar de él, ni se puede ingresar ni ingresar)
Entonces ... ¿cómo puedo deshacerme de esta situación y enviar mi código a Github?
No estaré de acuerdo con la respuesta aceptada por 2 razones:
- Hay muchas razones para fallar y olvidar un archivo.
- Pierdes tus mensajes de confirmación y tu historial
Aquí están mis sugerencias:
Punto de injerto
Debe tener un archivo $ GIT_DIR / .git / shallow con un punto de injerto. Si el historial es lo suficientemente simple, este punto de injerto debería permitirle empujar aunque la documentación indique lo contrario.
Parches
Esto le permite mantener el historial de compromiso y etc:
git format-patch origin..master
Luego clonar el origen y volver a aplicar:
git clone origin_path
cp shallow_clone/*.patch deep_clone
cd deep_clone
git am *.patch
Esta vez puedes empujar!
git push
Opción 1) Si todavía tienes el repositorio original, solo busca un poco antes de presionar:
git fetch --unshallow
Opción 2) ¡CUIDADO! esto solo se recomienda para nuevos repositorios, ya que esto PENDRÁ una pérdida de historial, ¡y también es altamente propenso a conflictos!
Si ya ha eliminado el repositorio desde el que obtuvo el archivo, debe descartar todo el historial.
git filter-branch -- --all
git push
git filter-branch
: le permite reescribir el historial de revisiones de Git
--
: separa las opciones de rama de filtro de las opciones de revisión
--all
: para reescribir todas las ramas y etiquetas
Si está trabajando en un clon superficial y la falta de historial está causando un problema, puede obtener más historial con la opción --depth
.
git fetch --depth=20
Donde 20 es la cantidad de compromisos para obtener. Auméntalo si eso no es suficiente.
También puedes usar la opción --depth
con git pull
.
Tuve un problema similar al enviar un repositorio de clones poco profundos a los servidores de Bitbucket y no tuve acceso a la historia antigua. Finalmente, había encontrado una solución. Vea un script de ejemplo con comentarios a continuación:
#!/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