Search code examples
gitmergedirectorysubdirectory

Can I move the .git directory for a repo to it's parent directory?


I have two sub-directories each with a repo, thus :

PPP/
 |--ABC/
 |   |--.git/
 |   |--AAA/
 |   |    BBB/
 |   |   CCC/
 |   
 |--DEF/
 |   |--.git/
 |   |--DDD/
 |   |--EEE/

And would like to combine them into one repo, so, I would assume the directory structure would be like this:

PPP/
 |--.git/
 |--ABC/
 |   |--AAA/
 |   |--BBB/
 |   |--CCC/
 |   
 |--DEF/
 |   |--DDD/
 |   |--EEE/

Is this posible?

Also currently several people have the repos on their machines. How much more complicated does that make life?

Ta.


Solution

  • You can do what you are describing like this:

    1. Move the content of ABC to an ABC/ subdirectory, and fix the history so that it looks like it has always been there:

      $ cd /path/to/ABC
      $ git filter-branch --index-filter \
          'git ls-files -s | sed "s-\t-&ABC/-" |
           GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
           git update-index --index-info &&
           mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
      

      Now your directory structure is ABC/ABC/your_code

    2. Same for the content of DEF:

      $ cd /path/to/DEF
      $ git filter-branch --index-filter \
          'git ls-files -s | sed "s-\t-&DEF/-" |
           GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
           git update-index --index-info &&
           mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
      

      Now your directory structure is DEF/DEF/your_code

    3. Finally, create the PPP repository and pull both ABC and DEF into it:

      $ mkdir /path/to/PPP
      $ cd /path/to/PPP
      $ git init
      $ git pull /path/to/ABC
      $ git pull /path/to/DEF
      

      Now you have PPP/ABC/your_code and PPP/DEF/your_code, along with all the history.

    You should probably ask you collegues to run the previous commands on their system, in order for everyone to be synchronized.

    Note: the funky filter-branch commands come from the man page. :-)