tag repositorio que crear git git-filter-branch

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 / - "