¿Cómo puedo mover un directorio en un repositorio Git para todas las confirmaciones?
Digamos que tengo un repositorio que incluye esta estructura de directorios:
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 se vea como si _posts
siempre existió en la raíz del repositorio, y quiero ser capaz de obtener toda la historia de some-post.html
a 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 descubierto exactamente cómo hacerlo. Alguna idea?
2 answers
Puede usar el filtro del subdirectorio para lograr esto
$ git filter-branch --subdirectory-filter blog/ -- --all
EDIT 1: Si no desea hacer de manera efectiva _posts
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á. Usa esto en su lugar:
$ git filter-branch --tree-filter 'test -d blog/_posts && mv blog/_posts . || echo "Nothing to do"' HEAD
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-05 21:38:51
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 dirs anidados como dir1 / dir2 / dir3 / - "
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-27 17:57:25