git: how to merge commits from a remote to a different path?

I have a git repository with remote foo.

foo is a web app, is contains some files and dirs directly in its root:

  • Git Bash & Pageant not using keys
  • Gitolite gives error message when pushing gitolite-admin: could not symlink
  • Can a file added to the index be retrieved?
  • Speed up bash script that uses several find commands
  • git merge of head with origin/master failed because of these files in Netbeans
  • Set up a default directory structure on git init
  • Rakefile
    app
    ...
    public
    script
    

    My main git repository is a larger system which comprises this web app. I want to pull the commits from foo, but I need the files to reside inside the web dir. So they should become web/app, web/public, etc.

    I don’t want to use foo as a submodule. I want to merge foo into the main repository and then get rid of it.

  • How to see whats changed between last commit and now(after making some changes)
  • Using a non-default key name (other than id_rsa)
  • Why is git pull showing new branches all the time?
  • Anonymise a local git repository?
  • Git detached head using Git Tower
  • Git push error: unpack failed: index-pack abnormal exit
  • 3 Solutions collect form web for “git: how to merge commits from a remote to a different path?”

    Here’s a community-wiki version of your answer if you’d like to accept it as the answer.


    This answers my question:

    http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html

    The up-to-date resources for subtree merging are:

    • Git Book chapter6.7
    • How to use the subtree merge strategy
    • GitHub article “Working with subtree merge”

    Cite from How to use the subtree merge strategy:

    In this example, let’s say you have the repository at /path/to/B (but it can be an URL as well, if you want).
    You want to merge the master branch of that repository to the dir-B subdirectory in your current branch.

    Here is the command sequence you need:

    $ git remote add -f Bproject /path/to/B
    $ git merge -s ours --no-commit Bproject/master
    $ git read-tree --prefix=dir-B/ -u Bproject/master
    $ git commit -m "Merge B project as our subdirectory"
    
    $ git pull -s subtree Bproject master
    

    See also for comments the article “Subtree merging and you”.

    Git Baby is a git and github fan, let's start git clone.