如何从GitHub上托管的远程Git repo中仅下载特定文件夹或目录?

举个GitHub repo的例子:

git@github.com:foobar/Test.git

其目录结构:

Test/
├── foo/ 
│   ├── a.py
│   └── b.py   
└── bar/
    ├── c.py
    └── d.py

我只想下载foo文件夹,而不是克隆整个测试项目。


当前回答

将git存储库文件夹下载到当前目录并删除git文件。

#!/bin/sh    

function download_git_folder() {
  repo_url=$1
  branch=$2
  repo_subfolder_path=$3
  
  repo_folder=$(basename $repo_url)
  git init
  git remote add -f origin ${repo_url}
  git config core.sparseCheckout true
  echo "${repo_subfolder_path}" >> .git/info/sparse-checkout
  git pull origin ${branch}
  mv "${repo_subfolder_path}"/* ./

  readarray -td/ root_subfolder <<<"${repo_subfolder_path}"; declare -p root_subfolder;
  rm -rf ./.git ${root_subfolder[0]}
}

用法

download_git_folder "git@github.com:foobar/Test.git" "master" "Test/bar" 

其他回答

如果您需要以编程方式执行,并且不想依赖SVN,则可以使用GitHubAPI递归下载所有内容。

为了获得灵感,以下是我的红宝石要点:https://gist.github.com/cvengros/b2a7e82f66519d423b6f

您可以将ghget与从地址栏复制的任何URL一起使用:

ghget https://github.com/fivethirtyeight/data/tree/master/airline-safety

这是一个独立的可移植shell脚本,不使用SVN(这对我来说在大型回购中不起作用)。它也不使用API,因此不需要令牌,也不受速率限制。

免责声明:我做到了。

你可以尝试为chrome使用gitzip扩展,它超级容易使用,而且以前也帮我下载了很多文件夹!

要从GitHub导出目录,请将目录url中的“/tree/master/”替换为“trunk/”。

例如,要从以下URL导出目录:

https://github.com/liferay/liferay-plugins/tree/master/portlets/sample-hibernate-portlet

运行以下命令:

svn export https://github.com/liferay/liferay-plugins/trunk/portlets/sample-hibernate-portlet

其他答案没有错,但我只是想为那些第一次在这个过程中徘徊的人分享一步一步的指导。

如何从github存储库(Mac OS X)下载单个文件夹:

~要打开终端,只需单击聚光灯并键入终端,然后点击enter

在Mac上,您可能已经拥有SVN(只需测试开放终端和键入“svn”或“which svn”~(不带引号)在Github上:通过单击repo中的特定文件夹名称,找到git文件夹(而不是repo)的Github路径从浏览器的地址栏复制路径打开终端并键入:svn export下一步粘贴地址(例如):https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI替换单词:tree/master带有单词:trunk键入文件的目标文件夹(在本例中,I将目标文件夹存储在当前用户)这里空格只是空格键而不是单词(空格)~/Downloads/HeadsUpUI最后一个终端命令显示下载文件夹(将地址与步骤5进行比较)svn导出https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI~/下载/HeadsUpUI

BTW-如果您在Windows或其他平台上,您可以在以下位置找到subversion(svn)的二进制下载http://subversion.apache.org

~如果您想签出文件夹而不是简单地下载它,请尝试使用svn帮助(tldr:replace export with checkout)

使现代化

关于恢复中断的下载/签出的评论。我会尝试先运行svn清理,然后再运行svn更新。请在SO中搜索其他选项。