34

我有一个包含子目录的 git 存储库。示例 dirA/dirB。有没有办法git clone在 Unix 服务器上只从子目录(dirB)中提取文件?

除了克隆之外,还有其他 git 命令可以执行此操作吗?

我如何 git 一个特定的文件?

4

6 回答 6

35

假设您的项目位于名为 的目录中project,并且您只需要那些涉及的提交project/dirB

然后:

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

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

于 2012-08-06T20:12:03.680 回答
19

参见https://www.kernel.org/pub/software/scm/git/docs/git-archive.html

使用 shell 命令:

git archive --remote=<repo_url> <branch> <path> | tar xvf -
于 2013-10-25T15:38:11.670 回答
1

这不是真正的克隆,但如果你只是想要一个项目的一部分来开始一个新的 repo,进入你的 repo 并

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

然后去 /somewhere/else 并在那里开始一个新的回购。

于 2017-02-02T23:41:50.290 回答
1

我想分享一个解决方法。您可以克隆整个 repo,然后为子目录创建一个符号链接:

mkdir <repo_dir>
cd <repo_dir>
git clone <repo_url>
ln -s <sub_dir> <your_location_where_you_want_to_checkout_sub_dir>

同样,这不是解决方案 - 只是一种解决方法。您仍将克隆整个 repo,并且只能从 . 但是,这在我的某些情况下很有用。

于 2017-01-02T19:43:12.803 回答
0

Git 在存储库级别上工作。您将不能只选择一个子目录。如果您感兴趣的存储库有一个 Web 界面,您可能能够导航到您的子目录并获取它。

于 2012-08-06T19:58:17.980 回答
-1

如果您只想克隆存储库的一部分,您应该查看git submodules

子目录由特定的 git 存储库管理,并在主存储库中作为子模块引用。

克隆主存储库时,不会自动克隆子模块。

于 2012-08-06T20:00:58.897 回答