How can I move a directory and files to a sub-directory along with commit history?
For example:
Source directory structure: [project]/x/[files & sub-dirs]
Target directory structure: [project]/x/p/q/[files & sub-dirs]
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
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 theshopt -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 commandshopt -s extglob
(though I'm sure there is an alternative), so this approach should work across shells (subbing in your shell'smkdir
andrmdir
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.