2011-05-14 16 views
25

Duplicar posibles:
How to split a git repository while preserving subdirectories?División de un conjunto de archivos dentro de un repositorio git en su propio repositorio, preservar la historia relevante

En un momento he añadido mi código a un repositorio git existente , y se han comprometido bastante desde entonces, mientras que el otro desarrollador se ha comprometido con los otros archivos existentes en el repositorio. Ahora quiero dividir mi código en su propio repositorio, pero conservar todo el historial de cambios para mis archivos particulares.

Lectura a través de lo que otros han hecho por división de código que yo estaba buscando en filter-branch y haciendo --index-filter o --tree-filter con rm comandos para los archivos que no se preocupan. No quiero usar --subdirectory-filter ya que no es apropiado para el subdirector que sostiene que mi código sea el dir superior (también compartimos un subdirectorio). Para complicar las cosas, algunos de los archivos del repositorio original se han movido un poco con el tiempo, y hay algunos archivos que se crearon y luego se eliminaron. Esto hace que el diseño de una lista rm sea un poco ... desafiante.

Estoy buscando una forma de filtrar todo/excepto/una lista de archivos/directorios. ¿Alguien sabe de una manera de hacer esto?

+1

Gracias. Lo hice con 'git filter-branch --prune-empty --index-filter 'git ls-tree -r --name-only --full-tree $ GIT_COMMIT | grep -v "^ src/pyfedpkg $" | grep -v "^ src/fedpkg" | grep -v "^ git-changelog" | xargs git rm --cached -r '- --all' – jkeating

+2

No es lo mismo que http://stackoverflow.com/questions/2797191/how-to-split-a-git-repository-while-preserving-subdirectories (En mi humilde opinión) ya que está pidiendo que se preserve un conjunto particular de archivos dispersos. – rogerdpack

+2

¡Esto no es un duplicado! La pregunta/respuesta proporcionada allí (2797191) solo se aplica a los archivos en un único directorio. Esta pregunta es para pedir un conjunto de archivos, agrupados innecesariamente en un directorio. – jxy

Respuesta

39

Solo para cerrar el bucle en este para que aparezca como respondido.

Mediante el uso de index-filter o tree-filter y luego aplicar la lógica inversa como git ls-tree hilo en (múltiples) grep -v 's canaliza en xargs para git rm de hecho puede eliminar todo lo que no coincide con un conjunto limitado de nombres de ficheros/directorios. Aquí está el comando que solía dividir mis archivos particulares:

git filter-branch \ 
    --prune-empty \ 
    --index-filter ' 
     git ls-tree -z -r --name-only --full-tree $GIT_COMMIT \ 
     | grep -z -v "^src/pyfedpkg$" \ 
     | grep -z -v "^src/fedpkg" \ 
     | grep -z -v "^git-changelog" \ 
     | xargs -0 -r git rm --cached -r 
    ' \ 
    -- \ 
    --all 
+2

Cuando se ingresa un archivo en el árbol en un commit por sí mismo, la parte "grep | xargs git rm" dará como resultado un código de salida distinto de cero y [--index-filter fallará] (https://github.com/git/git/commit/8c1ce0f46b85d40f215084eed7313896300082df). Tuve que aumentar xargs con la opción -r o --no-run-if-empty (extensión GNU). Sugiero aumentar la respuesta como tal. – lkraav

+1

Esto falla para mí con "pathspec 'SomeDir/SomeSubDir' no coincide con ningún archivo." SomeSubDir es solo la primera parte del nombre de un subdirectorio que contiene un espacio. Parece que esta solución no funciona en repositorios con subdirectorios que contener espacios. ¿Algun solución posible? –

+0

Creé un script bash con 'sed 's// \\/g'' y lo inserté después del último grep. Utilicé un script para evitar problemas con las comillas simples. Eso ayudó, pero Todavía me quedan commits vacíos. –

Cuestiones relacionadas