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 shopt
built-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 the shopt -s extglob
example wrong so my way may not have be necessary, but I typically do use zsh instead of bash, and it didn't have the command shopt -s extglob
(though I'm sure there is an alternative), so this approach should work across shells (subbing in your shell's mkdir
and rmdir
if 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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…