2012-05-20 42 views
22

Estoy tratando de dividir un subproyecto fuera de mi repositorio de git. Sin embargo, a diferencia de Detach (move) subdirectory into separate Git repository no lo tengo en su propio subdirectorio (y moverlo y hacer lo anterior solo produce el historial después del movimiento).Eliminar archivos eliminados del historial de git

He clonado la rama desde la que quiero dividir el subproyecto en su propio repositorio y he eliminado todo lo que no utiliza el subproyecto, así que básicamente podría usarlo como repositorio de mi subproyecto.

Ahora quiero deshacerme del historial de todos los archivos que ya no están en este repositorio a fin de mantener solo el historial de archivos para los archivos que lo hicieron en la descendencia.

creo que debe ser posible con git-filter-branch, pero no puedo encontrar la manera

Muchas gracias de antemano

+0

Ver también [Nuevo repositorio con historial copiado de solo los archivos actualmente rastreados] (http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files) . –

Respuesta

5

Here are some instructions to do what you want.

Esto eliminará file_to_remove:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --prune-empty -- --all 
+19

La cuestión es que quiero guardar los archivos y su historial que están en el directorio de trabajo y olvidarme de todos los demás. Sería bastante engorroso encontrar primero todos los archivos eliminados y eliminarlos con el comando anterior, es por eso que aunque lo encontré no es demasiado uso –

1

Ok, ahora estoy intentando con la siguiente técnica, informaré si funcionó, porque parece que lleva bastante tiempo ejecutándose: En un zsh o bash en un repositorio clonado

git log --diff-filter=D --summary <start_commit>..HEAD | egrep -o '*[[:alnum:]]*(/[[:alnum:].]*)+$' > deleted.txt 

para obtener todos los archivos borrados

for del in `cat deleted.txt` 
do 
    git filter-branch --index-filter "git rm --cached --ignore-unmatch $del" --prune-empty -- --all 
    # The following seems to be necessary every time 
    # because otherwise git won't overwrite refs/original 
    git reset --hard 
    git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 
    git reflog expire --expire=now --all 
    git gc --aggressive --prune=now 
done; 

Esto podría considerarlas peligrosas, extremadamente para sus datos por lo que sólo tratan de clones.

+0

¿Qué acabas de encontrar? –

+1

La razón por la que parece funcionar tan lento para usted es porque está ejecutando el comando 'git filter-branch' *** una vez por cada archivo ***, junto con muchos otros comandos (' git gc' no es un comando barato o rápido para ejecutar) en lugar de ejecutarlo *** una vez para todos los archivos ***, por lo que es extremadamente ineficiente. Vea los comentarios en [Nuevo informe con el historial copiado de solo los archivos actualmente rastreados] (http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files). –

+0

¿Empujará a github o gitlab para limpiar el repositorio remoto? –

Cuestiones relacionadas