Cloning subtree/subdirectory of git repo

17,808

Solution 1

the only other way I can think of doing it, is cloning the whole repo to some temp directory and then copying the files over, but that's not as much fun.

Yet, this is preferable, considering that even a partial clone, if it existed, would still preserve the asset/tools path structure.
You can do a sparse checkout elsewhere, and then copy your files.

With Git 2.17/2.18, you can attempt a partial or narrow clone, to clone only a subfolder, but that supposes the remote server does support this new feature.

Another more classic option is to use (if the remote repository supports it) the archive (zip file) of the latest HEAD: see "How to checkout only one file from git repository ('sparse checkout')?", but apply to a subfolder of the archive, instead of a file.

Solution 2

For Github repos, you can clone any sub-directories of any repo using the tool github-clone

Install it like this:

pip install git+git://github.com/HR/github-clone#egg=ghclone

Then use it like this:

ghclone https://github.com/HR/Crypter/tree/dev/app
Share:
17,808

Related videos on Youtube

Alexander Mills
Author by

Alexander Mills

Dev, Devops, soccer coach. https://www.github.com/oresoftware

Updated on June 05, 2022

Comments

  • Alexander Mills
    Alexander Mills almost 2 years

    I have a git repo on Github, looks like so:

    .git/
    assets/
      tools/
        a.sh
        b.sh
        c.sh
    

    of course the .git folder is not in version control, but you get the idea. And I want to copy the tools/*.sh to a local directory, at this path:

    ./scripts/git/tools
    

    My current directory is a git repo that shares a totally different history than the remote git repo, I just want to copy some files from the remote, I don't want to merge anything.

    I figure I could do something like this:

    git clone --path assets/tools/*.sh "$remote_repo"  ./scripts/git/tools
    

    but that command is not real, is there some command I can use to do this?

    the only other way I can think of doing it, is cloning the whole repo to some temp directory and then copying the files over, but that's not as much fun.

  • johnb003
    johnb003 almost 6 years
    The only thing I would add is maybe do a shallow clone: git clone --depth 1 --branch [branch_name] --single-branch
  • VonC
    VonC almost 6 years
    @johnb003 I agree: that would really limit the amount of data cloned.
  • blockhead
    blockhead over 2 years
    This is a very straight forward answer.