How do I clone, fetch or sparse checkout a single directory or a list of directories from git repository?
This bash
function below does the trick.
function git_sparse_checkout { # git repository, e.g.: http://github.com/frgomes/bash-scripts local url=$1 # directory where the repository will be downloaded, e.g.: ./build/sources local dir=$2 # repository name, in general taken from the url, e.g.: bash-scripts local prj=$3 # tag, e.g.: master local tag=$4 [[ ( -z "$url" ) || ( -z "$dir" ) || ( -z "$prj" ) || ( -z "$tag" ) ]] && \ echo "ERROR: git_sparse_checkout: invalid arguments" && \ return 1 shift; shift; shift; shift # Note: any remaining arguments after these above are considered as a # list of files or directories to be downloaded. mkdir -p ${dir} if [ ! -d ${dir}/${prj} ] ;then mkdir -p ${dir}/${prj} pushd ${dir}/${prj} git init git config core.sparseCheckout true local path="" # local scope for path in $* ;do echo "${path}" >> .git/info/sparse-checkout done git remote add origin ${url} git fetch --depth=1 origin ${tag} git checkout ${tag} popd fi}
This is an example of how this can be used:
function example_download_scripts { url=http://github.com/frgomes/bash-scripts dir=$(pwd)/sources prj=bash-scripts tag=master git_sparse_checkout $url $dir $prj $tag "user-install/*" sysadmin-install/install-emacs.sh}
In the example above, notice that a directory must be followed by /*
and must be between single quotes or double quotes.
UPDATE: An improved version can be found at: https://github.com/frgomes/bash-scripts/blob/master/bin/git_sparse_checkout
If you only want the files without history you can use svn:
SUBDIR=foosvn export https://github.com/repository.git/trunk/$SUBDIR