ver sobrescritos siguientes serán revertir oneline modificados los log locales fusionar error eliminar cambios archivos archivo git extraction git-filter-branch

sobrescritos - git ver archivos modificados



Cómo extraer un archivo con historial de confirmaciones de un repositorio git con index-filter & co (3)

Primero, una nota rápida, que incluso un hechizo como en un comentario sobre la división de un conjunto de archivos dentro de un repositorio git en su propio repositorio, conservando el historial relevante

SPELL=''git ls-tree -r --name-only --full-tree "$GIT_COMMIT" | grep -v "trie.lisp" | tr "/n" "/0" | xargs -0 git rm --cached -r --ignore-unmatch'' git filter-branch --prune-empty --index-filter "$SPELL" -- --all

no ayudará con los archivos nombrados como imaging/DrinkkejaI<0300>$''/302/210''.txt_74x2032.gif . La parte aI<0300>$''/302/210'' una vez fue una sola letra: ä .

Así que para extraer un solo archivo, además de la rama de filtro, también necesitaba hacer:

git filter-branch -f --subdirectory-filter lisp/source/model HEAD

Alternativamente, puede usar --tree-filter: (la prueba es necesaria, porque el archivo estaba en otro directorio anteriormente, vea: ¿Cómo puedo mover un directorio en un repositorio de Git para todas las confirmaciones? )

MV_FILTER=''test -f source/model/trie.lisp && mv ./source/model/trie.lisp . || echo "Nothing to do."'' git filter-branch --tree-filter $MV_FILTER HEAD --all

Para ver todos los nombres que ha tenido un archivo, use:

git log --pretty=oneline --follow --name-only git-path/to/file | grep -v '' '' | sort -u

Como se describe en http://whileimautomaton.net/2010/04/03012432

También siga los pasos a continuación:

$ git reset --hard $ git gc --aggressive $ git prune $ git remote rm origin # Otherwise changes will be pushed to where the repo was cloned from

Mi situación fue que tengo un repositorio git convertido de SVN a HG a GIT, y quería extraer solo un archivo fuente. También tuve caracteres extraños como aÌ (una falta de coincidencia de codificación dañada Unicode ä) y espacios en los nombres de archivo.

Parece que no es particularmente fácil, y esa es la razón por la que responderé mi propia pregunta a pesar de muchas preguntas similares con respecto a git [index-filter | subdirectory-filter | filter-tree], ¡ya que necesitaba usar todas las anteriores para lograr esto!

Entonces la pregunta es: "¿Cómo puedo extraer un archivo de un repositorio y colocarlo en la raíz del nuevo repositorio?"


Tenga en cuenta que las cosas se vuelven mucho más fáciles si combina esto con el paso adicional de mover los archivos deseados a un directorio nuevo.

Este podría ser un caso de uso bastante común (por ejemplo, mover el único archivo deseado al directorio raíz).
Lo hice (usando git 1.9) de esta manera (primero moviendo el (los) archivo (s), luego borrando el árbol viejo):

git filter-branch -f --tree-filter ''mkdir -p new_path && git mv -k -f old_path/to/file new_path/'' git filter-branch -f --prune-empty --index-filter ''git rm -r --cached --ignore-unmatch old_path''

Incluso puede usar comodines fácilmente para los archivos deseados (sin perder el tiempo con grep -v).

Pensaría que esto (''mv'' y ''rm'') también se podría hacer en una rama de filtro, pero no funcionó para mí.

No lo probé con personajes extraños, pero espero que esto ayude de todos modos. Hacer las cosas más fáciles parece ser siempre una buena idea para mí.

Insinuación:
Esta es una acción que consume tiempo en repositorios grandes. Entonces, si desea realizar varias acciones (como obtener un montón de archivos y luego reorganizarlos en ''new_path / subdirs''), es una buena idea hacer la parte ''rm'' tan pronto como sea posible para obtener un árbol más pequeño y rápido.


Un filtro más rápido y fácil de entender que logra lo mismo:

git filter-branch --index-filter '' git read-tree --empty git reset $GIT_COMMIT -- $your $files $here '' / -- --all -- $your $files $here