Как я могу клонировать, получить или разархивировать один каталог или список каталогов из репозитория git? - PullRequest
0 голосов
/ 12 февраля 2020

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

Для удобства людей, которые попадают сюда, это ссылки на другие похожие вопросы:

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

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

1 Ответ

1 голос
/ 12 февраля 2020

Эта 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
        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
}

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

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
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...