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

时间:2016-03-21 22:09:33

标签: git git-submodules svn-externals git-sparse-checkout

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

tools

thirdparty

shared
├──Common
├──Exceptions

multimedia
├──VolumeControl
├──VideoRenderer

android
├──Audio

例如,android依赖于shared / Common,shared / Exceptions,tools,thirdparty和multimedia / VolumeControl。

我试过了:

  1. 子模块:https://git-scm.com/book/en/v2/Git-Tools-Submodules
  2. 稀疏结账:http://jasonkarns.com/blog/subdirectory-checkouts-with-git-sparse-checkout/
  3. 但是,他们都在android文件夹中签出或带入多媒体文件夹。相反,我想要它:

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

    我如何做到这一点?

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

2 个答案:

答案 0 :(得分:4)

  

我如何做到这一点?

您可以使用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 将子树或 split 存储在子树中

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

enter image description here

答案 1 :(得分:0)

我想知道为什么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'