的 编辑 强> :从Git 2.19开始,这最终成为可能,正如在这个答案中可以看到的那样: https://stackoverflow.com/a/52269934/2988 。
考虑提出这个答案。
注意:在Git 2.19中,仅实现了客户端支持,仍然缺少服务器端支持,因此它仅在克隆本地存储库时有效。另请注意大型Git托管服务商,例如GitHub,实际上并没有使用Git服务器,他们使用自己的实现,所以即使支持显示在Git服务器上,它也不会自动意味着它可以在Git托管服务器上运行。 (OTOH,因为他们不使用Git服务器,他们可以在它们自己的实现中更快地实现它,然后才能在Git服务器中显示它。)
不,这在Git中是不可能的。
在Git中实现类似的功能将是一项重大工作,这意味着无法再保证客户端存储库的完整性。如果您有兴趣,请在git mailinglist上搜索关于“sparse clone”和“sparse fetch”的讨论。
一般来说,Git社区的共识是,如果你有几个总是独立检出的目录,那么这些实际上是两个不同的项目,应该存在于两个不同的存储库中。您可以使用将它们粘合在一起 Git子模块 。
对于其他用户 的 只是想下载 强> 来自github的文件/文件夹,只需使用:
svn export <repo>/trunk/<folder>
例如
svn export https://github.com/lodash/lodash.com/trunk/docs
(是的,这是svn在这里。显然在2016年你仍然需要svn来简单地下载一些github文件)
礼貌: 从GitHub仓库下载单个文件夹或目录
的 重要 强> - 确保更新github URL并替换 /tree/master/ 用'/ trunk /'。
/tree/master/
作为bash脚本:
git-download(){ folder=${@/tree\/master/trunk} folder=${folder/blob\/master/trunk} svn export $folder }
的 注意 强> 此方法下载文件夹,不克隆/签出。您无法将更改推送回存储库。另一方面 - 与稀疏结账或浅结账相比,这导致更小的下载。
Git 1.7.0有“稀疏结账”。看到 “core.sparseCheckout”中的 git config 手册页 , “稀疏结账”中 git read-tree 手册页 ,和 “Skip-worktree bit”中的 git update-index 手册页 。
接口不如SVN那样方便(例如,在初始克隆时无法进行稀疏检出),但现在可以使用可以构建更简单接口的基本功能。
如果您从未计划与克隆的存储库进行交互,则可以执行完整操作 的 git clone 强> 并使用重写您的存储库 的 git filter-branch --subdirectory-filter 强> 。这样,至少会保留历史记录。
这是我为单个子目录稀疏结账的用例编写的shell脚本
localRepo=$1 remoteRepo=$2 subDir=$3 # Create local repository for subdirectory checkout, make it hidden to avoid having to drill down to the subfolder mkdir ./.$localRepo cd ./.$localRepo git init git remote add -f origin $remoteRepo git config core.sparseCheckout true # Add the subdirectory of interest to the sparse checkout. echo $subDir >> .git/info/sparse-checkout git pull origin master # Create convenience symlink to the subdirectory of interest cd .. ln -s ./.$localRepo$subDir $localRepo
你要做的是做一个 的 稀疏结账 强> ,该功能已添加到git 1。7。0(2012年2月)。做稀疏的步骤 克隆 如下面所述:
mkdir <repo> cd <repo> git init git remote add -f origin <url>
这将使用您的遥控器创建一个空的存储库,并获取所有对象但不检查它们。然后做:
git config core.sparseCheckout true
现在,您需要定义要实际检出的文件/文件夹。这是通过列出它们来完成的 .git/info/sparse-checkout ,例如:
.git/info/sparse-checkout
echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout
最后但并非最不重要的是,使用远程状态更新您的空仓库:
git pull origin master
您现在将“检出”文件 some/dir 和 another/sub/tree 在您的文件系统上(仍然存在这些路径),并且不存在其他路径。
some/dir
another/sub/tree
你可能想看一下 扩展教程 你可能应该阅读这位官员 稀疏结账的文档 。
作为一个功能:
function git_sparse_clone() ( rurl="$1" localdir="$2" && shift 2 mkdir -p "$localdir" cd "$localdir" git init git remote add -f origin "$rurl" git config core.sparseCheckout true # Loops over remaining args for i; do echo "$i" >> .git/info/sparse-checkout done git pull origin master )
用法:
git_sparse_clone "http://github.com/tj/n" "./local/location" "/bin"
请注意,这仍将从服务器下载整个存储库 - 只有结帐大小减少。目前,无法仅克隆单个目录。但是,如果您不需要存储库的历史记录,则可以通过创建浅层克隆来至少节省带宽。看到 乌丹丹的回答 下面有关如何组合浅的信息 克隆 和稀疏结帐。
仅使用Git克隆子目录是不可能的,但下面是几个解决方法。
您可能希望重写存储库以使其看起来像 trunk/public_html/ 曾经是它的项目根,并丢弃所有其他历史(使用 filter-branch ),尝试已结帐分支:
trunk/public_html/
filter-branch
git filter-branch --subdirectory-filter trunk/public_html -- --all
备注: -- 将过滤器分支选项与修订选项分开,以及 --all 重写所有分支和标签。所有信息包括原始提交时间或合并信息 的 罐头 强> 。这个命令很荣幸 .git/info/grafts 文件和引用 refs/replace/ 命名空间,所以如果您有任何移植或替换 refs 定义,运行此命令将使它们永久化。
--
--all
.git/info/grafts
refs/replace/
refs
警告!重写的历史将具有所有对象的不同对象名称,并且不会与原始分支会聚。您将无法在原始分支的顶部轻松推送和分发重写的分支。如果您不知道完整的含义,请不要使用此命令,并且无论如何都要避免使用它,如果简单的单个提交就足以解决您的问题。
这里有简单的步骤 稀疏结账 将稀疏地填充工作目录的方法,这样你就可以告诉Git工作目录中哪些文件夹或文件值得检出。
像往常一样克隆存储库( --no-checkout 是可选的):
--no-checkout
git clone --no-checkout git@foo/bar.git cd bar
如果已经克隆了存储库,则可以跳过此步骤。
提示:对于大型回购,请考虑 浅克隆 ( --depth 1 )只签出最新版本或/和 --single-branch 只要。
--depth 1
--single-branch
启用 sparseCheckout 选项:
sparseCheckout
指定稀疏结帐的文件夹( 的 无 强> 最后的空间):
echo "trunk/public_html/*"> .git/info/sparse-checkout
或编辑 .git/info/sparse-checkout 。
检查分支(例如 master ):
master
git checkout master
现在您应该在当前目录中选择了文件夹。
如果您有太多级别的目录或过滤分支,您可以考虑使用符号链接。
我只是 写了一个脚本 对于 GitHub上 。
python get_git_sub_dir.py path/to/sub/dir <RECURSIVE>