¿Hacer que la confirmación actual sea la única confirmación (inicial) en un repositorio de Git?
Actualmente tengo un repositorio Git local, que envío a un repositorio Github.
El repositorio local tiene ~10 confirmaciones y el repositorio de Github es un duplicado sincronizado de este.
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 la única confirmación (y, por lo tanto, las versiones anteriores de los archivos dentro del repositorio no se almacenen).
Luego me gustaría enviar estos cambios a Github.
He investigado la rebase de Git, pero parece ser más adecuada 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 están rastreados; si es posible, me gustaría mantener el seguimiento de estos archivos.
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á utilizando submódulos, debe utilizar, por ejemplo, rebase interactivo
Paso 1: elimine todo el historial ( asegúrese de tener una copia de seguridad, no se puede revertir )
cat .git/config # save your <github-uri> somewhere
rm -rf .git
Paso 2: reconstruya el repositorio de Git solo con el contenido actual
Antes del paso 2, si no ha configurado init.defaultBranch
la configuración, hágalo a través de git config --global init.defaultBranch <branch-name>
su opción main
como <branch-name>
en el ejemplo actual.
git init
git add .
git commit -m "Initial commit"
Paso 3: envíelo a GitHub.
git remote add origin <github-uri>
git push -u --force origin main
La única solución que funciona para mí (y mantiene los submódulos funcionando) es
git checkout --orphan newBranch
git add -A # Add all files and commit them
git commit
git branch -D master # Deletes the master branch
git branch -m master # Rename the current branch to master
git push -f origin master # Force push master branch to github
git gc --aggressive --prune=all # remove the old files
Eliminar .git/
siempre causa grandes problemas cuando tengo submódulos. Usarlo git rebase --root
de alguna manera me causaría conflictos (y tomaría mucho tiempo ya que tenía mucha historia).
Este es mi enfoque favorito:
git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree})
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.