How to move a git repository into another directory and make that directory a git repository?
GitGit Problem Overview
I have a directory gitrepo1. This directory is a git repository.
-
I would like to move this gitrepo1 into another directory newrepo.
-
Directory newrepo should be the new git repository with no loss of git history and should contain the directory gitrepo1.
-
Directory gitrepo1 should just be a directory now (inside newrepo), without any
.git
index, i.e. it should NO longer be an independent git repository or a submodule.
How can I do this?
Git Solutions
Solution 1 - Git
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.
Solution 2 - Git
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.
Solution 3 - Git
I am no expert, but I copy the .git folder to a new folder, then invoke: git reset --hard
Solution 4 - Git
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.
Solution 5 - Git
simple way to move a git repository into another directory and make that directory a git repository using mirroring method
git clone --mirror [email protected]/mirror-repository.git
cd mirror-repository.git
push changes to new repository using below command
git push --mirror [email protected]/new-mirror.git
This will get all the branches and tags that are available in the mirror repository and will replicate those into the new location.
Don’t use git push --mirror in repositories that weren’t cloned by --mirror as well. It’ll overwrite the remote repository with your local references (and your local branches).git clone --mirror is prefered over git clone --bare because the former also clones git notes and some other attributes.