git子模块和子树之间的差异

Nat*_*n H 269 git git-submodules git-subtree

使用git子模块和子树之间有什么概念上的区别?

每种情况的典型情况是什么?

小智 321

子模块是链接;

子树是副本


Von*_*onC 163

如果我希望链接始终指向外部仓库的HEAD怎么办?

您可以使子模块遵循子模块远程仓库的分支的HEAD,具有:

o git submodule add -b <branch> <repository> [<path>].(指定要遵循的分支)
o 默认情况下git submodule update --remote将子模块的内容更新为最新的HEAD .即使使用,您的主项目仍将跟踪子模块的HEAD的哈希值.<repository>/<branch>origin/master--remote


  • 您的答案似乎与此处的投票答案背道而驰:http://stackoverflow.com/questions/10443627/force-git-submodule-to-always-stay-current (2认同)
  • 另一点可能有用:`git submodule` 是一个“核心”Git 命令,它是 Git 代码库的一部分。`git subtree` 位于“contrib”目录中,它不是由 Git 的 Makefile 安装的(尽管有些发行版确实提供了它),因此它的开发和维护较少。 (2认同)
  • @philb 好点。我已将您的评论包含在答案中以获得更多可见性。 (2认同)

Nik*_*s P 108

概念上的区别是:

使用git子模块,您通常希望将大型存储库分成较小的存储库.引用子模块的方式是maven风格 - 您引用来自另一个(子模块)存储库的单个提交.如果您需要在子模块中进行更改,则必须在子模块中进行提交/推送,然后在主存储库中引用新提交,然后提交/推送更改的主存储库引用.这样,您必须能够访问两个存储库以进行完整构建.

使用git子树,您可以在其中集成另一个存储库,包括其历史记录.因此,在集成它之后,存储库的大小可能更大(因此这不是保持存储库更小的策略).集成后,没有与其他存储库的连接,除非您想获得更新,否则不需要访问它.因此,这种策略更适用于代码和历史重用 - 我个人不使用它.

  • 但是使用 `git subtree` 你仍然可以推送 - 如果你愿意的话 - 对吧? (4认同)
  • @lxx 如果您知道存储库 URL... (2认同)
  • @adi518 是的,如果您是创建子树的人。但是,如果您将存储库推送到 GitHub 并且其他人将其克隆下来,我认为他/她不会自动知道子树 URL。 (2认同)
  • @NiklasP - 你能详细说明“引用主存储库中的新提交”吗?这是我不清楚如何执行的一步,因此“更改参考”也不是我所理解的。 (2认同)

Mat*_*att 21

子模块
推主仓库到远程不压子模块的文件

sub-tree
将主repo推送到远程推送子树的文件

  • “将主存储库推送到远程推送子树的文件”不,不是。 (2认同)

小智 10

考虑子树和子模块的最简单方法是,子树是被拉入父存储库的存储库的副本,而子模块是指向另一个存储库中的特定提交或分支的指针。


pxe*_*eba 6

[Git 子模块 - Atlassian]

当您想要将嵌入式存储库的提交历史记录与主存储库分开时,Git 子模块非常有用。但是,使用子模块可能很复杂且难以管理,尤其是当您需要更新嵌入式存储库时。

[Git 子树以及与子模块的比较 - Atlassian]

Git 子树是一种解决方案,允许将一个存储库作为子目录合并到另一个存储库中,但保留整个提交历史记录。当您想要在不同项目之间共享一组文件而不需要维护单独的存储库时,它非常有用。使用子树比使用子模块更简单,并且通常更易于管理。

简而言之,如果您需要将共享存储库的提交历史记录与主存储库分开,那么 git 子模块可能是最佳选择。如果您需要在不同项目之间共享一组文件而不需要维护单独的存储库,那么 git subtree 可能是最佳选择。


获取/更新工作流程比较

让我们比较一下发送和接收更新的命令:

1. 子模块

#push updates:
cd path/to/submodule
1. git add .
2. git commit -m "Submodule Update"
3. git push origin master
cd ..
4. git add submodule
5. git commit -m "Submodule ref update"
6. git push origin master
# >Needs to be in this order! Easy to get trouble<

#pull:
git submodule update --remote
Run Code Online (Sandbox Code Playgroud)

2. 子树

#push updates:
cd path/to/shared/repo
1. git add .
2. git commit -m "Subtree update"
3. git push origin master
#then
4. git subtree push --prefix=path/to/shared/repo shared-repo master

#pull:
git subtree pull --prefix=path/to/shared/repo shared-repo master
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

73614 次

最近记录:

8 年,7 月 前