代码之家  ›  专栏  ›  技术社区  ›  Richard Gomes

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

  •  0
  • Richard Gomes  · 技术社区  · 4 年前

    如何从git存储库中克隆、获取或稀疏签出单个文件或目录或文件或目录列表,从而避免下载整个历史记录,或者至少将历史记录下载保持在最低限度?

    为了方便人们在这里登陆,这些是对其他类似问题的参考:

    很久以前就有人问过这些类似的问题,从那以后,git不断发展,最终导致了大量不同的答案,有些更好,有些更差,具体取决于所考虑的git版本。问题是,上述问题中的任何一个答案都不能满足所有这些问题的所有要求,这意味着你必须阅读所有答案,并在脑海中编译自己的答案,最终满足所有要求。

    这里的问题扩展了前面提到的问题,提出了比所有其他问题加起来更灵活、更严格的要求。所以,再一次:

    如何从git存储库中克隆、获取或稀疏签出单个文件或目录或文件或目录列表,从而避免下载整个历史记录,或者至少将历史记录下载保持在最低限度?

    1 回复  |  直到 3 年前
        1
  •  12
  •   Richard Gomes    3 年前

    这个 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

        2
  •  0
  •   gdkrmr Pittoro    3 年前

    如果你只想要没有历史记录的文件,你可以使用svn:

    SUBDIR=foo
    svn export https://github.com/repository.git/trunk/$SUBDIR