使用git仅克隆子目录

34

我有一个包含子目录的git仓库。例如 dirA/dirB。在Unix服务器上,有没有办法执行git clone只拉取子目录(dirB)中的文件?

除了clone之外,是否还有其他的git命令可以实现这一点?

如何从git中获取特定文件?


6
有没有办法只克隆 Git 仓库中某个子目录? - supervacuo
1
这里有简单的答案 - Peter Krauss
已经回答。2022年更新的答案请参见https://dev59.com/QHRB5IYBdhLWcg3wgXhV#73254328 - Evan MJ
6个回答

35

假设您的项目在名为project的目录中,并且您仅想获取那些涉及project/dirB的提交记录。

那么,请执行以下操作:

git clone project/ subproject/
cd subproject
git filter-branch --prune-empty --subdirectory-filter dirB HEAD 

subproject现在将包含涉及dirB的Git历史记录。


2
这个方法很好地获取了初始子目录内容,但当我执行后续的 pull 时,它与原始分支合并了... - monkut
如果您不想要整个git历史记录,请添加--depth 0标志。 - user742030

19

1

这并不是真正的克隆,如果你只想要项目中的一部分来创建一个新的仓库,请进入你的仓库并

git archive master <subdir> | tar -x -C /somewhere/else

然后前往其他地方并在那里开始一个新的存储库。

1
我想分享一个解决方法。您可以克隆整个仓库,然后为子目录创建符号链接:
mkdir <repo_dir>
cd <repo_dir>
git clone <repo_url>
ln -s <sub_dir> <your_location_where_you_want_to_checkout_sub_dir>

再次声明,这不是一种解决方案 - 只是一个解决方法。您仍将克隆整个存储库,但只能从中拉取更改。然而,在我的某些情况下,这非常有用。


0

Git 是基于仓库级别的操作。你无法只选择子目录。如果你感兴趣的仓库有一个 Web 接口,你可以尝试导航到你的子目录并获取它。


是的,Git 在一个仓库上工作,但由于数据可移动性的挑战,希望拥有轻量级的 checkout 是很高的。 - cgseller

-1
如果您想克隆仓库的部分内容,您应该查看git子模块
子目录由特定的git仓库管理,并在主仓库中作为子模块引用。
当您克隆主仓库时,子模块不会自动克隆。

5
当您克隆主存储库时,子模块不会自动克隆。为什么?这太荒谬了 :( - hugemeow
17
这并不回答问题。它基本上表示:“我没有对你的问题有一个答案,所以我会回答另一个问题,因为我认为你应该这样做。” - Eduardo Bezerra
@EduardoBezerra 没错。我更倾向于先给出答案,然后再评论其他替代方案。请查看 Bruno Thomas 的回答。 - Aalex Gabi
“Git sparse”可能是更好的选择。请查看此答案(https://dev59.com/QHRB5IYBdhLWcg3wgXhV#13738951)。 - Highmastdon

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