repositorio - git push
Cómo mover un archivo de un repositorio git a otro conservando el historial (2)
Estoy tratando de mover un solo archivo (llámalo foo.txt) de un repositorio a otro repositorio (no relacionado), preservando su historial. La pregunta de ebneter muestra cómo hacer esto para un subdirectorio. La pregunta de Taw tiene algunos consejos y sugerencias, pero no un procedimiento paso a paso a seguir. La pregunta de jkeating parecía prometedora, pero no funcionó para mí. Las búsquedas de Google salieron vacías para este caso de uso particular. Lo que estoy buscando es una secuencia clara de comandos para lograr esto.
La secuencia de comandos que comencé a seguir fue esta:
$ git clone source-repo/ source-repo-copy
$ cd source-repo-copy
$ git filter-branch --tree-filter ''test ! "$@" = "foo.txt" && /
git rm --cached --ignore-unmatch $@ || true'' --prune-empty
La lógica de mi comando de filtro es git rm
todos los archivos que no son foo.txt. Agregué el || true
|| true
al comando para forzarlo a tener un valor de retorno cero para satisfacer la rama filtro.
Mi intención era establecer source-repo-copy como un control remoto para mi repositorio de destino (target-repo), y suponiendo que git filter-branch
filtrara todo excepto foo.txt, busque y combine source-repo-copy en target-repo. Desafortunadamente, el comando git filter-branch
parecía no tener ningún efecto. Se ejecutó sin errores y pareció repasar las más de 600 confirmaciones en el repositorio de origen, pero cuando terminó, el git log
y los archivos en el repositorio de origen se parecían. ¿No deberían faltar todos los archivos pero foo.txt y todos los commits que no lo tocaron desaparecieron del registro?
En este punto, no sé cómo proceder. ¿Alguna sugerencia?
Consulte mi respuesta a una pregunta similar sobre cómo mover carpetas donde también respondo cómo mover un archivo. https://.com/a/24693985/464618
Intenté copiarlo aquí, pero parece que no está permitido porque fue eliminado.
Esto funcionó para mí, pero con un directorio completo.
Como se muestra here
~$ cd neu
~/neu$ git filter-branch --subdirectory-filter FooBar HEAD
~/neu$ git reset --hard
~/neu$ git remote rm origin
~/neu$ rm -r .git/refs/original/
~/neu$ git reflog expire --expire=now --all
~/neu$ git gc --aggressive
~/neu$ git prune
~/neu$ git remote add origin git://github.com/FooBar/neu.git
EDITAR: para un solo archivo:
Filtra el directorio primero:
git filter-branch --prune-empty --subdirectory-filter myDirectory -- --all
Filtra el único archivo:
git filter-branch -f --prune-empty --index-filter "git rm --cached --ignore-unmatch $(git ls-files | grep -v ''keepthisfile.txt'')"
Haz algo de limpieza:
git reset --hard
git gc --aggressive
git prune
Esto debería hacerlo.