Actualmente tengo un repositorio local de Git, que envío a un repositorio de Github.
El repositorio local tiene ~ 10 confirmaciones, y el repositorio de Github es un duplicado sincronizado de esto.
Lo que me gustaría hacer es eliminar TODO el historial de versiones del repositorio Git local, para que el contenido actual del repositorio aparezca como el único compromiso (y, por lo tanto, las versiones anteriores de los archivos dentro del repositorio no se almacenan).
Entonces me gustaría enviar estos cambios a Github.
He investigado Git rebase, pero esto parece ser más adecuado para eliminar versiones específicas. Otra posible solución es eliminar el repositorio local y crear uno nuevo, ¡aunque esto probablemente generaría mucho trabajo!
ETA: Hay directorios / archivos específicos que no se rastrean; si es posible, me gustaría mantener el seguimiento de estos archivos.
fuente
Respuestas:
Aquí está el enfoque de fuerza bruta. También elimina la configuración del repositorio.
Nota : ¡Esto NO funciona si el repositorio tiene submódulos! Si está usando submódulos, debe usar, por ejemplo, rebase interactivo
Paso 1: elimine todo el historial ( asegúrese de tener una copia de seguridad, no se puede revertir )
Paso 2: reconstruya el repositorio de Git solo con el contenido actual
Paso 3: empuja a GitHub.
fuente
.gitignore
deberías manejar eso, ¿verdad?git commit -m "Initial commit"
eso, probablemente pueda omitir lagit remote add ...
parte, suponiendo que ya estaba en su configuración, y pasar directamente a presionar. A mí me funcionó.La única solución que funciona para mí (y mantiene funcionando los submódulos) es
Eliminar
.git/
siempre causa grandes problemas cuando tengo submódulos. Usar degit rebase --root
alguna manera me causaría conflictos (y llevaría mucho tiempo desde que tenía mucha historia).fuente
git push -f origin master
como la última operación y el sol brillará nuevamente en tu nuevo repositorio! :)git gc --aggressive --prune all
todo el punto de perder la historia se echaría de menos.Este es mi enfoque favorito:
Esto creará una nueva rama con una confirmación que agrega todo en HEAD. No altera nada más, por lo que es completamente seguro.
fuente
git-rev-parse
documentos. Lo que sucede aquígit-commit-tree
requiere una referencia a un árbol (una instantánea del repositorio), peroHEAD
es una revisión. Para encontrar el árbol asociado con un commit usamos el<rev>^{<type>}
formulario.git push --force <remote> new_branch_name:<remote-branch>
La otra opción, que podría resultar mucho trabajo si tienes muchos commits, es un rebase interactivo (suponiendo que tu versión de git sea> = 1.7.12):
git rebase --root -i
Cuando se le presenta una lista de confirmaciones en su editor:
Guardar y cerrar. Git comenzará a rebasar.
Al final, tendría una nueva confirmación de raíz que es una combinación de todas las que vinieron después.
La ventaja es que no tiene que eliminar su repositorio y si tiene dudas, siempre tiene un respaldo.
Si realmente desea destruir su historial, restablezca el maestro a esta confirmación y elimine todas las demás ramas.
fuente
error: failed to push some refs to
git push --force-with-lease
. force-with-lease se usa porque es menos destructivo que --force.Variante del método propuesto por larsmans :
Guarde su lista de archivos sin seguimiento:
Guarde su configuración de git:
Luego realice los primeros pasos de larsmans:
Restaura tu configuración:
Destraza tus archivos sin seguimiento:
Entonces cometer:
Y finalmente empuje a su repositorio:
fuente
A continuación se muestra un script adaptado de la respuesta de @Zeelot. Debe eliminar el historial de todas las ramas, no solo la rama maestra:
Funcionó para mis propósitos (no estoy usando submódulos).
fuente
git branch
incluirá un asterisco al lado de su sucursal desprotegida, que luego se bloqueará, lo que hará que se resuelva en todos los archivos o carpetas como si también fueran nombres de sucursal. En cambio, usé logit branch --format="%(refname:lstrip=2)"
que me dio solo los nombres de las ramas.git push --force origin master
ogit push --force-with-lease
? Aparentemente, este último es más seguro (ver stackoverflow.com/questions/5509543/… )Puede usar clones poco profundos (git> 1.9):
Lectura adicional: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/
fuente
git filter-branch
es la herramienta de cirugía mayor.--parent-filter
pone a los padres en stdin y debe imprimir los padres reescritos en stdout; Unixtrue
sale con éxito y no imprime nada, así que no hay padres.@^!
es la abreviatura de Git para "el responsable principal pero ninguno de sus padres". Luego borre todas las otras referencias y empuje a su gusto.fuente
Simplemente elimine el repositorio de Github y cree uno nuevo. Con mucho, el enfoque más rápido, fácil y seguro. Después de todo, ¿qué tiene que ganar al ejecutar todos esos comandos en la solución aceptada cuando todo lo que desea es la rama maestra con una sola confirmación?
fuente
El siguiente método es exactamente reproducible, por lo que no es necesario ejecutar clon nuevamente si ambos lados son consistentes, solo ejecute el script en el otro lado también.
Si luego quieres limpiarlo, prueba este script:
http://sam.nipl.net/b/git-gc-all-ferocious
Escribí un script que "mata la historia" para cada rama en el repositorio:
http://sam.nipl.net/b/git-kill-history
ver también: http://sam.nipl.net/b/confirm
fuente
git-hash: not found
ySupport for <GIT_DIR>/info/grafts is deprecated
git log HEAD~${1:-0} -n1 --format=%H
, aquí, sam.aiki.info/b/git-hash Sería mejor ponerlo todo en un script para consumo público. Si alguna vez lo uso nuevamente, podría descubrir cómo hacerlo con la nueva función que reemplaza a los "injertos".Una respuesta más conceptual:
git basura automáticamente recopila confirmaciones antiguas si no hay etiquetas / ramas / referencias que las señalen. Entonces, simplemente tiene que eliminar todas las etiquetas / ramas y crear una nueva confirmación huérfana, asociada con cualquier rama; por convención, dejaría que la rama
master
apunte a esa confirmación.Los viejos commits inalcanzables nunca serán vistos por nadie a menos que vayan a cavar con comandos git de bajo nivel. Si eso es suficiente para usted, simplemente me detendría allí y dejaría que el GC automático haga su trabajo cuando lo desee. Si desea deshacerse de ellos de inmediato, puede usarlos
git gc
(posiblemente con--aggressive --prune=all
). Sin embargo, para el repositorio de git remoto, no hay forma de forzarlo, a menos que tenga acceso de shell a su sistema de archivos.fuente
Aqui tienes:
También alojado aquí: https://gist.github.com/Zibri/76614988478a076bbe105545a16ee743
fuente
Resolví un problema similar simplemente borrando la
.git
carpeta de mi proyecto y reintegrando con el control de versiones a través de IntelliJ. Nota: la.git
carpeta está oculta. Puede verlo en el terminal conls -a
, y luego eliminarlo usandorm -rf .git
.fuente
Para eso, use el comando Shallow Clone git clone --depth 1 URL - Clonará solo el HEAD actual del repositorio
fuente
Más información aquí.
Git tutoturial aquí proporciona ayuda sobre cómo purgar el repositorio:
fuente