Как мне клонировать, получить или разархивировать один каталог или список каталогов из репозитория git?

Как мне клонировать, получить или разархивировать отдельный файл или каталог или список файлов или каталогов из репозитория git, избегая загрузки всей истории или, по крайней мере, сохраняя загрузку истории как минимум?

В интересах людей, приземляющихся здесь, это ссылки на другие подобные вопросы:

Эти похожие вопросы были заданы около 10 лет назад, и с тех пор git эволюционировал, что в итоге привело к потоку разных ответов, некоторые лучше, некоторые хуже, в зависимости от рассматриваемой версии git, но ни один из них не удовлетворял всем требованиям этих других вопросы объединены.

Этот вопрос здесь расширяет предыдущие упомянутые вопросы, предъявляя более жесткие требования, чем другие вопросы вместе взятые.

Всего 1 ответ


Эта функция bash ниже делает свое дело.

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
        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
}

Это пример того, как его использовать:

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
}

В приведенном выше примере обратите внимание, что за каталогом должна следовать /* и она должна находиться между одинарными или двойными кавычками.


Есть идеи?

10000