如何克隆仅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/diranother/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是不可能的。

链接地址: http://www.djcxy.com/p/27071.html

上一篇: How do I clone a subdirectory only of a Git repository?

下一篇: Cannot remove remote origin