To add to bmargulies’s comment, the complete sequence is:
mkdir -p x/p/q # make sure the parent directories exist first
git mv x/* x/p/q # move folder, with history preserved
git commit -m "changed the foldername x into x/p/q"
Try it first to see a preview of the move:
git mv -n x/* x/p/q
Wolfgang comments:
If you’re using bash, you can avoid the issue of trying to move a folder into itself by using an extended glob like so (using the
shoptbuilt-in):
shopt -s extglob; git mv !(folder) folder
Captain Man reports in the comments having to do:
mkdir temp
git mv x/* temp
mkdir -p x/p/q
git mv temp x/p/q
rmdir temp;
Context:
I am on Windows with Cygwin.
I just realized I did theshopt -s extglobexample wrong so my way may not have be necessary, but I typically do use zsh instead of bash, and it didn’t have the commandshopt -s extglob(though I’m sure there is an alternative), so this approach should work across shells (subbing in your shell’smkdirandrmdirif it’s especially foreign)
As an alternative, spanky mentions in the comments the -k option of git mv:
Skip move or rename actions which would lead to an error condition.
git mv -k * target/
That would avoid the “can not move directory into itself” error.