如何将一个特定的文件夹从一个git仓库作为git子模块添加?
如何将git repo中的特定文件夹添加为git子模块?
问题的出现原因:
在使用git进行项目管理时,有时候我们希望将另一个git仓库中的特定文件夹作为子模块添加到当前项目中。这样可以方便地管理不同仓库的代码,并且能够保持这些代码的独立性和版本控制。
解决方法:
下面是一种将特定文件夹添加为git子模块的解决方法:
1. 创建一个新的分支:
git branch new_branch
2. 将所需的文件移动到新的分支中:
git checkout new_branch
git mv required_files new_branch
git commit -m "Move required files to new branch"
3. 将子模块添加到主仓库中:
git submodule add
git commit -m "Add sub module to super repository"
4. 将子模块切换到新的分支:
cd path/to/submodule
git checkout new_branch
以上就是将特定文件夹添加为git子模块的解决方法。通过这种方法,我们可以将其他git仓库中的特定文件夹作为子模块添加到当前项目中,实现代码的管理和版本控制的统一。
如何将git存储库中的特定文件夹添加为git子模块?
如果您确实需要在自己的存储库历史记录中包含另一个存储库的一部分内容,那么与子模块相比,使用子树合并策略更为合适。
以下是解决方法的步骤:
1. 将另一个项目命名为"repo1",并进行拉取。
$ git remote add -f repo1 /path/to/repo1
2. 为将结果记录为合并的后续步骤做准备。
$ git merge -s ours --no-commit --allow-unrelated-histories repo1/main
3. 将"repo1"的"main"分支读取到子目录"repo1"中。
$ git read-tree --prefix=repo1/ -u repo1/main
4. 记录合并结果。
$ git commit -m "Merge repo1 as our subdirectory"
5. 使用"subtree"进行后续合并来维护结果。
$ git pull -s subtree repo1 main
无论哪种情况,都会将完整的存储库链接到您的存储库,而不仅仅是一个目录。
但是无法进行部分克隆。
您可以尝试将该目录隔离到自己的存储库中,然后将其作为子模块添加,但这意味着它的历史记录将与其最初来自的存储库完全分离。
一个现代的示例可以使用git filter-repo
:
1. 进入repo1目录。
$ cd /path/to/repo1
2. 使用git filter-repo
过滤出repo1SubFolder的内容。
$ git filter-repo --path repo1SubFolder
3. 将文件移动到根目录。
$ git filter-repo --subdirectory-filter repo1SubFolder/
4. 进入新的存储库,并为原始存储库添加远程。
$ cd /path/to/repo2 $ git remote add repo1 /path/to/repo1
5. 将文件和历史记录从该分支拉入repo2(仅包含要移动的目录)。
$ git pull repo1 main $ git remote rm repo1
在您的子树合并策略中,我发现这个注释特别相关:另外,如果对另一个项目进行更改,如果只使用子模块,则更容易提交更改。
11年后,我同意。现在我主要使用子模块。
链接页面比您想象的更容易消失,如果您能在此处添加实际示例,那将非常好。非常正确。我已在答案中包含了相关(并已更新)的示例。
问题的出现原因:在Git仓库中,如何将特定文件夹作为子模块添加,并解决Windows开发者不支持符号链接以及Antora/Asciidoctor不支持符号链接的问题。
解决方法:
1. 创建一个名为submodules
的目录。
2. 在该目录下添加子模块。
3. 在子模块中创建一个特定目录的符号链接。
这样一来,你可以使用默认的Git子模块行为,并且在项目中只使用子模块的一个子集。
需要注意的是,Windows开发者需要安装具有"Enable Symbolic Links"权限的GitBash,才能支持符号链接。
然而,Antora/Asciidoctor不支持符号链接,所以这种方法可能不适用于这些工具。