from - git rewrite file history
¿Cómo puedo reescribir el historial para que todos los archivos, excepto los que ya moví, estén en un subdirectorio? (2)
Tengo un proyecto bajo git
. Un día moví todos los archivos de proyecto del directorio actual a foo/bar/
debajo del proyecto. Lo hice usando git mv
. Luego agregué algunos archivos más e hice algunos cambios a los archivos ya existentes.
Como resultado, ahora cuando veo el historial de foo/bar/file.c
, solo puedo ver los cambios que hice después de mover el archivo.
Intenté arreglar esto de varias maneras ( filter-branch
con filtro de subdirectorio, etc.), pero nada ayudó, así que estoy bastante apilado aquí. Apreciaré cualquier ayuda que me puedas dar. ¡Gracias!
Para terminar, aquí hay un breve resumen de lo que hice. El comando que funcionó para mí fue:
if [ ! -e foo/bar ]; then mkdir -p foo/bar; git ls-tree --name-only $GIT_COMMIT | grep -v ^foo$ | xargs -I files mv files foo/bar || echo ""; fi
El comando echo que agregué al final aseguró que incluso cuando mv falla, todo el comando continuará ejecutándose. No movió el contenido de foo / bar / foo, pero puedo vivir con eso.
Muchas gracias a Dan Molding (!!!) y Jefromi por la ayuda.
Para reescribir el historial con los archivos movidos:
Si desea que el historial del proyecto parezca que todos los archivos siempre han estado en el directorio foo/bar
, entonces necesita hacer una pequeña cirugía. Use git filter-branch
con el "filtro de árbol" para reescribir los confirmaciones de modo que en cualquier lugar que no exista foo/bar
, se cree y se muevan todos los archivos:
git filter-branch --prune-empty --tree-filter ''
if [ ! -e foo/bar ]; then
mkdir -p foo/bar
git ls-tree --name-only $GIT_COMMIT | xargs -I files mv files foo/bar
fi''
Ahora el historial se registrará como si todos los archivos estuvieran siempre en foo/bar
.
Para ver el historial de un archivo movido:
Si solo desea ver el historial de un archivo que se ha movido o renombrado en algún momento en el pasado, simplemente use la opción --follow
para git log
:
git log --follow foo/bar/file.c