¿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?

Author: mipadi, 2010-06-29

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
 81
Author: artagnon,
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 / - "

 32
Author: theduke,
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