gpt4 book ai didi

git - 如何从 git 存储库克隆、获取或稀疏 check out 单个目录或目录列表?

转载 作者:行者123 更新时间:2023-12-03 14:15:48 24 4
gpt4 key购买 nike

如何从 git 存储库克隆、获取或稀疏 check out 单个文件或目录或文件或目录列表,以避免下载整个历史记录或至少保持历史记录下载最少?
为了登陆这里的人的利益,这些是对其他类似问题的引用:

  • How do I clone a subdirectory only of a Git repository?
  • How to sparsely checkout only one single file from a git repository?
  • Is it possible to do a sparse checkout without checking out the whole repository first?

  • 很久以前就有人问过这些类似的问题,从那以后 git 不断发展,最终导致了大量不同的答案,有些更好,有些更糟,具体取决于所考虑的 git 版本。麻烦的是,上述问题中没有一个答案能满足所有这些问题的所有要求,这意味着您必须阅读所有答案并在头脑中编译自己的答案,最终才能满足所有要求。
    这里的这个问题扩展了前面提到的问题,提出了比所有其他问题加起来更灵活和严格的要求。所以,再一次:
    如何从 git 存储库克隆、获取或稀疏 check out 单个文件或目录或文件或目录列表,以避免下载整个历史记录或至少保持历史记录下载最少?

    最佳答案

    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)/sources
    prj=bash-scripts
    tag=master
    git_sparse_checkout $url $dir $prj $tag "user-install/*" sysadmin-install/install-emacs.sh
    }
    在上面的例子中,注意一个目录后面必须跟着 /*并且必须在单引号或双引号之间。
    更新 :可以在以下位置找到改进版本: https://github.com/frgomes/bash-scripts/blob/master/bin/git_sparse_checkout

    关于git - 如何从 git 存储库克隆、获取或稀疏 check out 单个目录或目录列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60190759/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com