克隆 GitHub 项目的部分内容。

25

可能是重复的问题:
有没有办法仅克隆git存储库的子目录?

我正在尝试克隆github项目的部分内容,但我只能获取根文件夹。 这是我第一次尝试使用github,我刚刚安装了tortoisegit,我习惯于svn和cvs,可以只取出想要检出的文件夹,但似乎git只在根文件夹中有一个.git文件,所以我不确定该怎么做。


你只获取了.git目录,这看起来很奇怪。你确定正确地克隆了代码库吗? - Spoike
我觉得你误解了我的意思,我获取了所有的文件,但我只想要项目的一个子文件夹。 - Dennis
3个回答

8

这里有一种子树合并的方法。

但是,以下是一种更简单但只是部分解决方案,也许对您的需求已经足够。只需要fork一个版本库,并定期将其合并回来即可。

  1. 克隆存储库(Fork)
  2. 删除不需要的部分并将子文件夹移动到需要的位置
  3. 提交

在未来,当您想要与上游Git代码同步时,只需将其与您的Fork合并即可。您保留的文件将与上游的文件同步,您可能需要进行一些小的清理,这很容易从git status中看到。


2
听起来很复杂,为什么有人会选择使用Git而不是SVN或CVS呢? - Dennis
1
在 GitHub 的背景下,我认为 Git 使得与他人合作更加容易,无论是专业团队还是偶尔的贡献者。 - JasonSmith

7
在Git社区中,你想要的被称为“部分检出”。目前Git不支持此功能,但它偶尔会在邮件列表中出现。Git具有支持部分检出所需的一些内部组件,但没有简单的方法让用户使用它们。我猜测Git最终将能够执行部分检出,但可能需要一段时间才能实现。
除了jhs's answers(子树合并;rm、mv、commit、merge)之外,还有第三方的“子树”命令可以帮助更轻松地处理部分检出。虽然这不是它的主要目标,因此如何使用它来处理部分检出并不明显。如果你已经足够了解Git,你可以解决问题,但如果你是新手,这个子树命令可能会相当晦涩。

最后,如果你只想下载最新的文件,你可以使用git archive下载特定分支、标签(或任何提交)的tar文件。这可能在GitHub上无法正常工作(这取决于服务器配置),我没有检查过。即使它不能直接工作,你也可以克隆到自己的“裸”,镜像仓库,然后从那里拉取(子树)归档。


1
这个功能可能是从2009年10月以来添加的,但是要从GitHub获取存档,实际上在任何repo/fork/branch/commit的右上角有一个“下载”按钮,可以让您从历史记录中拉取代码的存档副本(例如,如果您首先导航到早期提交)。 - johnny

-1

这不是你在git中要做的事情。记住,你正在使用DVCS,因此你正在拉取整个存储库历史记录 - 那些更改目录之外文件的提交应该发生什么?

如果一个项目足够大,那么你克隆的任何repo的维护者都应该使用子模块来划分部分,以便开发人员只能拉取他们想要工作的区域。

Git(以及一般的DVCS)并不是为最终用户而设计的,而是为开发人员而设计的。我发现git(特别是与github结合使用)对编码非常有帮助。如果有一个我想要贡献的github项目,我只需fork它,拉下来,hackhackhack,推上去,然后发送一个pull请求,非常容易,而不是进行checkout,hack,创建差异,尝试找到要发送到哪里的位置,并希望差异在开发人员合并之前不会出错。

Git整体而言比svn更加复杂,但这是因为编程本身就是一个复杂的过程。对我来说,集中式版本控制工作流程非常痛苦,因为我习惯了分布式版本控制系统,而且我不能做我习惯做的所有事情。所以,如果你做相同的事情,使用git相对于svn会更加复杂,但优点是你可以做很多更多的事情。Git是为Linux内核开发而开发的,这一点非常明显。


5
我不认为这个东西不能由git提供。请求“给我所有与提交6789abc匹配的/foo/bar/.*文件”是明确且有用的。 - jameshfisher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接