How do I clone, fetch or sparse checkout a single directory or a list of directories from git repository?

后端 未结 1 1449
一生所求
一生所求 2021-01-06 02:34

How do I clone, fetch or sparse checkout a single file or directory or a list of files or directories from a git repository avoiding downloading the entire history or at lea

相关标签:
1条回答
  • 2021-01-06 03:05

    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 to use it:

    function example_download_scripts {
      url=http://github.com/frgomes/bash-scripts
      dir=$(pwd)/build/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.

    0 讨论(0)
提交回复
热议问题