How to move a git repository into another directory and make that directory a git repository?
It's very simple. Git doesn't care about what's the name of its directory. It only cares what's inside. So you can simply do:
# copy the directory into newrepo dir that exists already (else create it)
$ cp -r gitrepo1 newrepo
# remove .git from old repo to delete all history and anything git from it
$ rm -rf gitrepo1/.git
Note that the copy is quite expensive if the repository is large and with a long history. You can avoid it easily too:
# move the directory instead
$ mv gitrepo1 newrepo
# make a copy of the latest version
# Either:
$ mkdir gitrepo1; cp -r newrepo/* gitrepo1/ # doesn't copy .gitignore (and other hidden files)
# Or:
$ git clone --depth 1 newrepo gitrepo1; rm -rf gitrepo1/.git
# Or (look further here: http://stackoverflow.com/q/1209999/912144)
$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -
Once you create newrepo
, the destination to put gitrepo1
could be anywhere, even inside newrepo
if you want it. It doesn't change the procedure, just the path you are writing gitrepo1
back.
It's even simpler than that. Just did this (on Windows, but it should work on other OS):
- Create newrepo.
- Move gitrepo1 into newrepo.
- Move .git from gitrepo1 to newrepo (up one level).
- Commit changes (fix tracking as required).
Git just sees you added a directory and renamed a bunch of files. No biggie.
I am no expert, but I copy the .git folder to a new folder, then invoke: git reset --hard
To do this without any headache:
- Check what's the current branch in the gitrepo1 with
git status
, let's say branch "development". - Change directory to the newrepo, then
git clone
the project from repository. - Switch branch in newrepo to the previous one:
git checkout development
. - Syncronize newrepo with the older one, gitrepo1 using
rsync
, excluding .git folder:rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1
. You don't have to do this withrsync
of course, but it does it so smooth.
The benefit:
You are good to continue exactly where you left off: your older branch, unstaged changes, etc.