que - ¿Cómo puedo mover un directorio en un repositorio de Git para todas las confirmaciones?
que es head en git (2)
Digamos que tengo un repositorio que incluye esta estructura de directorio:
repo/
blog/
_posts/
some-post.html
another-file.txt
Quiero mover _posts
al nivel superior del repositorio, por lo que la estructura se verá así:
repo/
_posts/
some-post.html
another-file.txt
Esto es bastante simple con git mv
, pero quiero hacer que la historia parezca que _posts
siempre existieron en la raíz del repositorio, y quiero poder obtener todo el historial de some-post.html
través de git log -- _posts/some-post.html
. Me imagino que puedo usar algo de magia con git filter-branch
para lograr esto, pero no he resuelto exactamente cómo hacerlo. ¿Algunas ideas?
Puede usar el filtro de subdirectorio para lograr esto
$ git filter-branch --subdirectory-filter blog/ -- --all
EDIT 1: Si no quiere hacer _posts
efectivamente la raíz, use un filtro de árbol en su lugar:
$ git filter-branch --tree-filter ''mv blog/_posts .'' HEAD
EDIT 2: Si blog/_posts
no existía en algunas de las confirmaciones, lo anterior fallará. Use esto en su lugar:
$ git filter-branch --tree-filter ''test -d blog/_posts && mv blog/_posts . || echo "Nothing to do"'' HEAD
Si bien la respuesta de Ramkumar es muy útil y valiosa, no funcionará en muchas situaciones. Por ejemplo, cuando desea mover un directorio con otros subdirectorios a una nueva ubicación.
Para esto, la página man contiene el comando perfecto:
git filter-branch --index-filter /
''git ls-files -s | sed "s-/t/"*-&NEWSUBDIR/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new /
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"'' HEAD
Simplemente reemplace NEWSUBDIR con su nuevo directorio deseado. También puede usar directorios anidados como dir1 / dir2 / dir3 / - "