- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
“git submodule update”和进入git子模块目录并对每个目录执行“git pull”之间有什么区别(如果有的话)?
谢谢
最佳答案
这是有区别的。另外,我会注意到,我刻意避免使用子模块(也称为sobmodules,理由很充分:它们会让用户非常难过,或者沮丧,或者两者兼而有之)。
子模块是一个单独的git repo
为了区分“主”或“超级项目”和每个“子模块”,我们将顶层称为超级项目。当我们将子项目、子模块或子存储库作为存储库使用时,它们都只是“子repo”。
超级项目是一个普通的git存储库。它像往常一样有分支,并且提交在分支上(可选地提交不在分支上,等等)。它还为每个子模块记录了一些信息:
子模块存储库的url
子模块存储库的路径
子模块的提交ID
前两项存储在.gitmodules
中,这是超级项目工作树顶部的普通文件,格式为git config
文件(如$HOME/.gitconfig
和.git/config
)。.gitmodules
文件还可以包含每个子模块的附加信息,但前两项是必需的。
第三项commit id作为“gitlink”类型的文件存储在存储库中。这是在更改要用于特定子模块的提交时更新的文件。
为了便于描述,假设超级项目在路径libbig
和libsmall
下有两个子模块libs/big
和libs/small
。因此,您将得到一个路径为.gitmodules
和libs/big
的libs/small
。url可以是任何内容,这取决于libbig
和libsmall
的上游存储库的位置。
同时,git将在您的超级项目中记录一个名为libs/big
的“文件”,其内容为1a987f1356...
或其他内容,另一个名为libs/small
的“文件”,其内容是另一个丑陋的sha-1散列。
每个子模块都处于“分离头”状态
当您克隆并签出超级项目时,您还没有子模块的存储库,只有.gitmodules
文件和存储的提交id。使用git submodule update
将把存储库克隆到适当的目录中。然后,它将检查由gitlink条目标识的特定提交。
这使得每个子回购都处于“独立头”状态。
(即使对于所有较新的“分支”模式,情况似乎也是如此,尽管我还没有尝试过这种方式。)git pull
=git fetch
+git something
实际上,运行git pull
只是运行一个有限的git fetch
,然后运行另一个git命令:要么git merge
要么git rebase
。哪个远程用于获取步骤,哪个分支用于合并或重新定位步骤,由当前分支控制。这两个设置的值组合起来构成当前分支的上游设置:如果当前分支是$branch
,则上游是$remote/$merge
,其中$remote
是运行git config --get branch.$branch.remote
时的输出,而$merge
是运行git config --get branch.$branch.merge
时的输出。
由于您的子回购处于“头分离”状态,其“当前分行”为“无分行”,也称为特殊匿名分行。根据定义,这既没有远程设置,也没有合并设置。git config --get
命令将失败。
提取步骤仍然可以工作,因为git默认为从origin
中提取。不过,合并或重新定位步骤将不得不失败。因此git pull
不会有多大好处。git submodule update
完全做其他事情
它的功能是高度可配置的,所以see the documentation。一般来说,如果未配置,它只进行任何必要的初始化。而且,一般来说,它不会将子模块放在分支上:即使它基于分支名称更新子模块,它仍然会使子模块处于“分离头”状态。
扼要重述
子模块背后的一般思想是,您不关心分支,只关心原始提交id。每个子模块都说“从这个特定的存储库中获取这个特定的提交”,其中提交id记录在超级项目的“gitlink”条目中,子repo的url记录在超级项目的.gitmodules
文件中。因此,提交id和url包含在超级项目中的提交中:id通过gitlink“文件”,url通过.gitmodules
文件。
要将某个子模块指向另一个提交id,只需(哈哈)在子模块本身中签出新id,然后进入超级项目并将新id“git add”到相应的gitlink中。使用git submodule add
可以完成第二步。您几乎可以很容易地手动执行第二步(例外情况是,由于文件名完成在路径中留下“/”号,因此很容易或至少以前很容易以错误的方式键入操作)。一旦更新了所有子模块,然后“git commit”结果以在超级项目中进行新的commit,记录新的gitlink散列。
所有关于git submodule
的烦扰都是为了完成上述两个步骤(将git commit
步骤留给您手动完成)。
关于git - 黑白之间的差异'git submodule update'和'git pull',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38109608/
我有一个子模块,当我执行 git status 时,我得到: modified: (modified content) 我跑: git submodule update 但仍然得到: modi
我有一个子模块,当我执行 git status 时,我得到: modified: (modified content) 我跑: git submodule update 但仍然得到: modi
有什么区别吗 git submodule init && git submodule update --recursive 和 git submodule update --init --recurs
我掌握了 git submodule 的窍门(一厢情愿?),我想出了更具体的问题,这是一个好兆头...... 我试图在 .gitmodules 中找到 super 项目所指的子模块的哪个版本。和 .g
我花了很多时间阅读和尝试 git 子模块。但我真的放弃了。 我的问题: 我正在克隆一个 git 存储库作为子模块。所以,我做 git submodule add -b master url local
我无法推送我对 git 子模块所做的更改。我已经推送了主项目,得到了这个 mainProject$ git status On branch myBranch Changes not staged f
我正在使用 ROS 构建一个项目,因此,catkin_make 用于构建我的 ROS 节点和库。 我面临的问题是:我在一个包(包 A)中使用一个 git 子模块(因此,我有一个分层的包含文件夹结构)并
我在当前存储库中用作子模块的存储库名称是 droid-media-lib,但是放置此子模块的目录名称是 库 所以我的.gitmodules 看起来像这样 [submodule "droid-media
标题可能听起来有点含糊,但这里有一个错误的例子。假设我们有三个模块 ModuleA、ModuleB 和 ModuleC,因此 ModuleA 依赖于 ModuleB 和 ModuleB 依赖于 Mod
我有一个包含嵌套子模块的 git 仓库。下面两个命令有什么区别? git submodule update --init --recursive git submodule foreach --rec
我有一个 dotfiles 存储库,其中我所有的 vim 插件都存储为子模块,因此当它们有更改时很容易更新。我以为这两个命令做同样的事情,但我注意到这一定不是这种情况。 我知道我在几个子模块中有更新要
当我执行 git submodule update --init 时出现错误 fatal: Needed a single revision Unable to find current revisi
我正在使用 git submodule 在项目之间构建和共享组件。该项目尚未投入生产,因此,此时子模块运行良好。 但是我担心维护和部署,将其转换为 npm 包是个好主意吗? 最佳答案 一个 npm 包
typing 模块将两个类 io 和 re 导出为“伪子模块”,如下所示。通过赋予它们 __all__ 并将它们添加到 sys.modules 中,使它们看起来像模块的目的是什么? 我理解将它们排除在
在我 git submodule update 之后,它总是检查同一个提交。例如 34561。 我为子模块执行 git checkout master,然后执行 git submodule sync。
我一直对此感到困惑: $ git submodule You need to run this command from the toplevel of the working tree. 为什么我需
我刚 pull https://github.com/kolanos/kohana-universe现在我正在尝试更新所有正在运行的模块: git submodule update --init --
我觉得使用 Git 子模块对我的开发工作流程来说有点麻烦。我听说过 Git 子树和 Gitslave。 是否有更多适用于多个存储库项目的工具以及它们如何比较? 这些工具可以在 Windows 上运行吗
我正在尝试开发具有不同“子模块”的 API。例如,有一个称为“todo”,另一个称为“newsletter”。 我想要做的是,我希望能够在开发过程中运行模块本身,并且我希望能够在服务器上运行整个 AP
我正在尝试将子模块支持添加到 project of mine ,但是我似乎无法使用 JGit 来读取特定的提交或记录,而命令行 git 可以很好地做到这一点,尽 pipe 模块所在的头部是分离的(就子
我是一名优秀的程序员,十分优秀!