¿Hacer que la confirmación actual sea la única confirmación (inicial) en un repositorio de Git?

Resuelto kaese asked hace 12 años • 19 respuestas

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.

kaese avatar Mar 13 '12 18:03 kaese
Aceptado

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.defaultBranchla configuración, hágalo a través de git config --global init.defaultBranch <branch-name>su opción maincomo <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
Fred Foo avatar Mar 13 '2012 11:03 Fred Foo

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 --rootde alguna manera me causaría conflictos (y tomaría mucho tiempo ya que tenía mucha historia).

Zeelot avatar Oct 27 '2012 18:10 Zeelot

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.

dan_waterworth avatar Mar 22 '2013 13:03 dan_waterworth