签出 Git 存储库中的特定文件夹

Checkout a Specific Folder within a Git Repository

我在不同的存储库中有多个项目:

tools

thirdparty

shared
├──Common
├──Exceptions

multimedia
├──VolumeControl
├──VideoRenderer

android
├──Audio

例如,android 依赖于 shared/Common、shared/Exceptions、工具、第三方和 multimedia/VolumeControl。

我试过了:

  1. 子模块:https://git-scm.com/book/en/v2/Git-Tools-Submodules
  2. 稀疏结帐:http://jasonkarns.com/blog/subdirectory-checkouts-with-git-sparse-checkout/

但是,他们都在 android 文件夹中检出或导入多媒体文件夹。相反,我希望它像:

android
├──Audio
├──VolumeControl (brought in from multimedia)

我该如何完成?

注意:我曾经在 svn 中使用 lockexterns 来完成此操作。

How do I accomplish this?

您可以使用 git filter-branch 和或 git subtree split

filter-branch 将遍历每个提交,然后您可以只签出给定的文件,而 git subteree split 将是您的更好选择。

解释这两个选项,以便您可以选择您喜欢的一个。


示例代码:

filter-branch

# Filter the master branch to your directory and remove empty commits
git filter-branch --prune-empty --subdirectory-filter YOUR_FOLDER_NAME filter_from_branch

这会将您需要的所有文件从给定文件夹检出到当前目录


subtree split

git subtree git-subtree - Merge subtrees together or split repository into subtrees

git subtree split -P <name-of-folder> -b <name-of-new-branch>

我想知道为什么 git-submodule 无法实现。我记得,使用子模块可以指定目标目录,因此您可以这样做:

$ cd Android
$ git submodule add url/path-to-your-submodule-repo VolumeControl
$ git diff --cached --submodule # OPTIONAL - To verify before commit
$ git commit -m 'added multimedia/VolumeControl as sub-module'