tutorial commands change git heroku github shallow-clone

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:

  1. Hay muchas razones para fallar y olvidar un archivo.
  2. 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