How to move a git repository into another directory and make that directory a git repository?

Git

Git 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):

  1. Create newrepo.
  2. Move gitrepo1 into newrepo.
  3. Move .git from gitrepo1 to newrepo (up one level).
  4. 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:

  1. Check what's the current branch in the gitrepo1 with git status, let's say branch "development".
  2. Change directory to the newrepo, then git clone the project from repository.
  3. Switch branch in newrepo to the previous one: git checkout development.
  4. 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 with rsync 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPranjal MittalView Question on Stackoverflow
Solution 1 - GitShahbazView Answer on Stackoverflow
Solution 2 - Gitdavid.pfxView Answer on Stackoverflow
Solution 3 - GitgharelView Answer on Stackoverflow
Solution 4 - GitemremrahView Answer on Stackoverflow
Solution 5 - GitShah E Rome WaliView Answer on Stackoverflow