如何克隆仅Git存储库的子目录?
我有我的Git仓库,它的根目录有两个子目录:
/finisht
/static
当它在SVN中时, /finisht
在一个地方被检出,而/static
在其他地方被检出,如下所示:
svn co svn+ssh://admin@domain.com/home/admin/repos/finisht/static static
有没有办法与Git做到这一点?
此答案已过时,仅适用于低于1.7.0(2012年2月)的git版本。 请参阅下面的更新版本。
不,在Git中是不可能的。
在Git中实现这样的事情将是一项重大的努力,这意味着客户端存储库的完整性将无法得到保证。 如果您有兴趣,可以在git邮件列表上搜索关于“稀疏克隆”和“稀疏获取”的讨论。
一般来说,Git社区的共识是,如果你有几个独立检查的目录,那么这些实际上是两个不同的项目,应该存在于两个不同的存储库中。 您可以使用Git子模块将它们粘合在一起。
你所要做的就是称为稀疏结帐 ,并且该功能已添加到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
列出来完成的,例如:
echo "some/dir/" >> .git/info/sparse-checkout
echo "another/sub/tree" >> .git/info/sparse-checkout
最后但并非最不重要的是,用远程状态更新您的空回购:
git pull origin master
现在,您将在文件系统上为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"
请注意,这仍将从服务器下载整个存储库 - 只有结账尺寸减小。 目前无法克隆只有一个目录。 但是,如果您不需要存储库的历史记录,则至少可以通过创建浅克隆来节省带宽。 有关如何将浅克隆和稀疏结帐相结合的信息,请参阅udondan的答案。
您可以组合稀疏结帐和浅层克隆功能。 浅克隆会切断历史记录,而稀疏结帐只会提取与您的模式相匹配的文件。
git init <repo>
cd <repo>
git remote add origin <url>
git config core.sparsecheckout true
echo "finisht/*" >> .git/info/sparse-checkout
git pull --depth=1 origin master
你需要最低限度的git 1.9才能工作。 我自己只用2.2.0和2.2.2来测试它。
这样你仍然可以推送 ,这在git archive
是不可能的。
上一篇: How do I clone a subdirectory only of a Git repository?