He estado experimentando con el uso de git subtree y me he encontrado con la siguiente situación.
Utilicé git subtree para agregar un proyecto externo a mi repositorio, guardé intencionalmente todo el historial del proyecto ascendente, ya que quiero poder referirme al historial del proyecto y también contribuir al proyecto ascendente más adelante.
Como resultado, otro contribuyente al proyecto ascendente introdujo accidentalmente un archivo grande en la rama maestra. Para solucionar esto, el proyecto aguas arriba reescribió la historia y la fuerza empujada al maestro. Al crear mi "monorepo", incluí este commit y también me gustaría eliminarlo.
¿Cómo puedo actualizar mi repositorio para reflejar el nuevo historial del subárbol?
Mi primer intento fue usar filter-branch para eliminar completamente el subárbol y todo el historial.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
Una vez que se eliminó la versión anterior del subárbol, pude volver a agregar el subárbol usando el nuevo maestro ascendente. Sin embargo, esto no funcionó porque, por alguna razón, el historial de confirmación aún se muestra en la salida del registro git.
Actualizar
He escrito los pasos para crear un ejemplo mínimamente reproducible.
Primero crea un repositorio git vacío.
git init test-monorepo cd ./test-monorepo
Crea una confirmación inicial.
echo hello world > README git add README git commit -m 'initial commit'
Ahora agregue un subárbol para un proyecto externo.
git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
Haz algunos compromisos en el monorepo
echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
Ahora intente usar git filter-branch para eliminar el subárbol.
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
Examine la salida del registro de git, espero ver solo mi confirmación inicial.
git log
git gc --prune=now
solo eliminaría las confirmaciones que no aparecen git log
?
git log
, sin argumentos y todavía veo los viejos commits.