5.2 .gitmodules 用法
- 项目应用:毫米波雷达(优点:模块开发人员只维护模块即可)
- 路径示例:
- base:配置.gitmodules
- module1:
- module2:
# add and commit
git submodule add https://github.com/user/frontend.git frontend
git add .gitmodules frontend
git commit -m "Added frontend submodules"
# clone
git clone xxx.git --recursive
# git submodule update --init --recursive
# update all submodule
git submodule update --remote --recursive
# init (first add, clone, update .gitmodules)
git submodule init --all
5.2.1 .gitmodules 用法
.gitmodules
文件是 Git 仓库中用于管理子模块的一个配置文件。当你在 Git 仓库中使用子模块时,可以有一个或多个子模块,每个子模块对应 .gitmodules
文件中的一个条目。以下是如何使用 .gitmodules
文件来管理多个子模块的详细介绍和示例。
1. 初始化父仓库
首先,确保你有一个初始化的 Git 仓库作为父仓库。
mkdir parent-repo
cd parent-repo
git init
2. 添加子模块
使用 git submodule add
命令来添加子模块。你可以一次性添加多个子模块。例如,假设你想添加两个子模块,一个是用于前端资源的 frontend
,另一个是用于后端逻辑的 backend
。
git submodule add https://github.com/user/frontend.git frontend
git submodule add https://github.com/user/backend.git backend
这两条命令会将远程仓库 frontend
和 backend
分别作为子模块添加到当前父仓库的 frontend
和 backend
目录下。
3. .gitmodules
文件的生成
执行上述子模块添加命令后,Git 会自动为你创建 .gitmodules
文件,并填入类似下面的配置:
[submodule "frontend"]
path = frontend
url = https://github.com/user/frontend.git
[submodule "backend"]
path = backend
url = https://github.com/user/backend.git
每个 [submodule "name"]
条目都对应一个子模块,其中 path
是子模块在父仓库中的相对路径,url
是子模块的 Git 仓库地址。
4. 提交子模块
在添加了子模块并生成了 .gitmodules
文件后,你需要将这些更改提交到你的父仓库:
git add .gitmodules frontend backend
git commit -m "Added frontend and backend submodules"
5. 克隆含多个子模块的仓库
当你克隆一个包含多个子模块的父仓库时,可以使用 --recurse-submodules
选项来同时克隆父仓库和所有子模块:
git clone --recurse-submodules https://github.com/user/parent-repo.git
如果你想在之后某个时间点更新子模块,可以运行:
git submodule update --init --recursive
这将初始化所有子模块,并从它们的远程仓库拉取最新的内容。
6. 管理子模块更新
当你的子模块有更新时,你可以在子模块的目录中使用 Git 命令来更新它,然后提交更改到父仓库:
cd frontend
git fetch origin
git checkout new-branch-or-commit
cd ../..
git add frontend
git commit -m "Updated frontend submodule to new-branch-or-commit"
记得对每个需要更新的子模块重复这个过程。
7. 推送到远程仓库
当你的父仓库和子模块都有本地更改时,你可以将这些更改推送到远程仓库:
git push origin main
这里假设你正在推送到远程仓库的 main
分支。
注意事项
- 使用子模块时,要确保
.gitmodules
文件和子模块目录下的.git
配置都正确无误。 - 更新子模块可能涉及解决合并冲突,尤其是在子模块频繁更新的情况下。
- 子模块可以嵌套使用,即一个子模块也可以包含自己的子模块。
通过使用 .gitmodules
文件,你可以有效地管理多个 Git 子模块,使得代码重用和项目结构管理变得更加方便。
5.2.2 纯本地用法
如果你希望体验 Git 子模块(submodule)的功能,但是没有特定的本地或远程仓库 URL,你可以通过以下方式进行:
-
使用示例仓库:
你可以使用 GitHub 上的公共仓库作为子模块的示例。例如,Git 官方的测试仓库或任何其他公开的、你感兴趣的项目。 -
创建测试仓库:
在 GitHub 或其他 Git 托管服务上创建一个新的仓库,用于测试子模块功能。 -
本地模拟:
即使你没有远程仓库,也可以在本地模拟子模块的行为。创建两个本地仓库,一个作为父仓库,另一个作为子模块。
以下是使用本地仓库模拟子模块的步骤:
步骤 1: 创建父仓库
mkdir parent-repo
cd parent-repo
git init
步骤 2: 创建子模块仓库
mkdir ../child-repo
cd ../child-repo
git init
在子模块仓库中添加一些文件并提交:
touch README.md
git add README.md
git commit -m "Initial commit"
步骤 3: 将子模块仓库添加为父仓库的子模块
回到父仓库目录:
cd ..[parent-repo]
添加子模块:
git submodule add ../child-repo child-repo
这会将 ../child-repo
作为子模块添加到父仓库的 child-repo
目录下。
步骤 4: 提交并查看子模块
初始化并提交 .gitmodules
文件:
git submodule init
git add .gitmodules child-repo
git commit -m "Added child-repo as a submodule"
步骤 5: 克隆含子模块的仓库
克隆父仓库时,使用 --recurse-submodules
选项以克隆子模块:
git clone --recurse-submodules [parent-repo-url]
如果你在本地操作,可以使用相对路径作为 URL:
git clone --recurse-submodules ..[parent-repo] parent-repo
步骤 6: 更新子模块
模拟远程子模块更新,可以简单地在子模块仓库中进行新的提交:
cd child-repo
touch new-file.txt
git add new-file.txt
git commit -m "Add new file"
然后,在父仓库中更新子模块:
cd ..[parent-repo]
git submodule update --remote child-repo
git add child-repo
git commit -m "Updated child-repo submodule"
通过这些步骤,你可以在本地环境中体验 Git 子模块的添加、更新和克隆等基本操作,而无需访问远程服务器。这对于学习和测试子模块功能非常有帮助。
5.2.3 git submodule init
- git submodule init 什么时候用,多个子模块怎么用
git submodule init
命令用于初始化子模块的配置,它是 git submodule update
命令的一部分,通常与 --recursive
选项一起使用来初始化仓库中的所有子模块。当你有多个子模块时,这个命令会为每个子模块设置正确的配置。
以下是 git submodule init
的使用场景和方法:
使用场景:
-
首次添加子模块后:当你首次在父仓库中添加子模块后,需要运行
git submodule init
来初始化子模块的配置。 -
克隆含子模块的仓库后:如果你克隆了一个包含子模块的仓库,并且使用了
--recurse-submodules
选项,Git 会自动为你初始化所有子模块。如果没有使用这个选项,你可以在克隆后运行git submodule init
来初始化子模块。 -
更新子模块配置:如果子模块的
.gitmodules
文件被更新(例如,更改了子模块的 URL),你需要运行git submodule init
来应用这些更改。
使用方法:
对于单个子模块,你可以这样初始化:
git submodule init <submodule-path>
其中 <submodule-path>
是子模块在父仓库中的路径。
对于多个子模块,你可以:
-
逐个初始化:如果你只想初始化特定的子模块,可以重复上述命令,为每个子模块调用一次。
-
使用
--all
选项:如果你想一次性初始化所有子模块,可以使用--all
选项:git submodule init --all
-
结合
--recursive
选项:如果你的子模块中还包含了嵌套的子模块,并且你想要递归地初始化所有层级的子模块,可以结合使用--recursive
选项:git submodule init --recursive
这将初始化当前仓库中的所有子模块,并且如果这些子模块中有任何嵌套的子模块,它们也会被递归地初始化。
初始化后的常见操作:
-
更新子模块:初始化子模块后,通常需要更新子模块到最新的提交,可以使用
git submodule update
命令。 -
提交更改:初始化子模块后,需要将
.gitmodules
和.gitconfig
文件的更改添加到父仓库并提交。
示例:
假设你有一个父仓库,里面有两个子模块 backend
和 frontend
,你可以这样初始化它们:
git submodule init backend
git submodule init frontend
如果你想要一次性初始化所有的子模块,可以使用:
git submodule init --all
记得在初始化子模块后,使用 git submodule update
命令来获取子模块的内容,并在完成后提交更改到父仓库。
5.2.4 git clone 子分支不是最新(有的是有的不是、配置没指定)
git clone xxx.git --recursive 有多个字库,其他两个都可以是最新,其中一个不是最新版本
git clone xxx.git 直接clone不是最新的库,下来是最新的
.gitmodules 没有指定版本,只配置了url
这是为什么?详细解释和解决
如果你使用 git clone --recursive
克隆一个包含多个子模块的 Git 仓库,理论上所有的子模块都应当被克隆并更新到 .gitmodules
文件中指定的状态。然而,如果其中一个子模块没有更新到最新版本,这可能是由以下原因造成的:
-
子模块的初始提交:
如果子模块在.gitmodules
中没有指定特定的分支或提交,Git 会默认检出子模块的main
或master
分支的 HEAD。如果该分支的 HEAD 不是最新的提交,那么你可能需要更新子模块。 -
子模块的状态:
如果子模块之前被检出到一个特定的提交(detached HEAD 状态),即使.gitmodules
没有指定版本,子模块也不会跟踪任何分支,导致无法获取最新的更新。 -
缓存的 Git 配置:
有时候,Git 可能会缓存一些关于子模块的旧配置,这可能影响到克隆过程中的状态。 -
网络或权限问题:
可能存在网络连接问题或权限问题,导致 Git 无法从远程仓库拉取子模块的最新内容。 -
Git 版本差异:
如果你使用的 Git 版本与仓库维护者使用的版本不同,可能会因为 Git 特性的差异导致克隆行为不一致。
要解决这个问题,你可以按照以下步骤操作:
检查子模块状态
首先,检查有问题的子模块的状态:
cd path/to/submodule
git status
这将显示子模块的当前状态,包括它指向的分支或提交。
更新子模块
如果子模块落后于远程仓库,你可以手动更新它:
cd path/to/submodule
git fetch origin
git reset --hard origin/main
这里假设 origin
是远程仓库的名称,main
是你想要跟踪的分支。请根据实际情况替换这些名称。
重新初始化子模块
如果手动更新不起作用,可以尝试重新初始化子模块:
cd path/to/parent-repo
git submodule deinit -f path/to/submodule
git submodule init path/to/submodule
git submodule update --recursive
这将重新初始化并更新所有子模块。
清理和重新克隆
如果问题依旧存在,考虑清理当前的克隆,并重新开始:
cd ..
rm -rf path/to/parent-repo
git clone --recursive xxx.git
检查 SSH 密钥和权限
确保你的 SSH 密钥设置正确,并且你有权访问所有子模块的远程仓库。
使用最新版本的 Git
确保你的 Git 客户端是最新版本,以避免可能的兼容性问题。
通过上述步骤,你应该能够解决子模块不是最新版本的问题。如果问题依然存在,可能需要进一步检查仓库的具体情况,或者联系仓库的维护者以寻求帮助。
git clone 指定分支
一、Git 介绍
- Git下载和安装
- Git命令行环境搭建(配合vscode使用)
- Git创建本地仓库
- 添加远程仓库,比如Gitlab(GitLab配置SSH密钥)
1.2 Git 使用教程
1.3 Git 查看和设置用户名和邮箱
问题:一台硬件服务器,若只有一个linux用户,
- vscode ssh 配置:文件、用户权限 (离线配置)
- vscode ssh 密钥登录配置:
- vscode git:不要每次输入用户名和密码(指定带用户名和密码的URL)
git如何查看和修改用户名和邮箱
问题:一台硬件服务器、只有一个linux用户、多个小伙伴同事使用该用户时,默认会导致使用同一个git用户提交上去
-
查看Git全局配置的用户名和邮箱
-
查看单个仓库的用户名和邮箱
二、Git 使用
2.0 项目实例
下载代码:从局域网GitLab服务器当指定分支代码
git clone ssh://git@xxx.git
cd standard/
git branch -a
git fetch origin v2.3.1 # 都git clone了,这句代码还有用么?
git checkout v2.3.1
git pull origin v2.3.1
补充说明:
git branch -a #查看所有分支
git fetch origin v2.3.1 #从远程的origin仓库的v2.3.1分支下载代码到本地的origin v2.3.1
git checkout v2.3.1 #切换到v2.3.1分支
git pull origin v2.3.1
首先,操作之前一定要看清分支!!
其次,提交代码之前一定要先更新代码!!
git branch -----查看当前分支
git pull -----更新代码到本地
提交代码:
0、提交代码前,先更新远程仓库的代码:git pull 或更新拉取指定分支的代码
1、在本地修改相应文件(或者文件新旧替换)
2、git add //文件名 (文件修改路径)(注意路径要写对)
3、git status ----查看当前本地文件信息
4、 git commit -m “更改信息备注”
5、git push --------提交代码到当前分支
(我一般git push 之前会看一下commit状态:git status)
到此Git提交代码就完成啦!
2.1 Git 本地仓库添加gitee远程仓库
已初始化本地仓库,新添加gitee远程仓库:
- 首先在 gitee 上新建一个空仓库(注意必须是空仓库)
- 然后按下面操作建立关系
2.2 GIT合并某一次提交到其他分支
将一个分支上的某个commit合并到另一个分支,可用使用cherry-pick命令实现。
比如将dev分支上commit_id为f99f2b57b7ee72d55a08e699fbeec34cbac96cb8的提交合并到master分支:
1)切换到master分支:git checkout master
2)执行cherry-pick命令:git cherry-pick f99f2b57b7ee72d55a08e699fbeec34cbac96cb8
3)推送到远程master仓库:git push
注意master上新的commit id与dev上的id并不相同,即只是将dev上的修改拷贝过来作为一个新的提交,这就会带来一个问题:cherry-pick之后,dev想再次merge到master,要先对dev分支进行rebase变基或拉取master分支最新代码。
如果用的是gitlab,也可以直接在页面上操作:
2.3 git 直接当指定分支代码
在没有git clone之前,你可以使用以下命令来查看远程仓库的分支列表:
git ls-remote --heads <remote-url>
要将指定分支的代码直接获取到本地,可以使用以下命令:
git clone -b <branch_name> <repository_url>
# 示例
git clone -b development https://github.com/username/repository.git
2.4 git patch的使用方法和场景
问题:
- 其他分支更新同步到当前分支
- GIT合并分支后原分支还在不在
- https://blog.csdn.net/JACKSONMHLK/article/details/125458704
Git 基本操作
git merge 合并分支
Git是什么?为什么要使用Git?
git是一个免费且开源的分布式版本控制系统,可以快速高效地应用于从小型到大型的项目,其实就是一个高级一点的版本控制系统。
https://blog.csdn.net/weixin_39902085/article/details/111204420
五、其他问题
push或者commint之后恢复
创建/操作/删除分支
参考资料
- git ---- 没有 .ssh 文件的解决方法
- git add和commit的区别
- git add 多个文件和文件夹的方法
- git push和git push origin
- git pull 和 git pull origin develop 的区别
- git branch && git checkout常见用法
- git checkout用法详解
- git merge合并分支
- git fetch 和 git fetch origin v2.3.1
- git fetch和git pull之间的区别
https://blog.csdn.net/dddxxxx/article/details/88545596
https://blog.csdn.net/weixin_30699831/article/details/101982286
二、简易的命令行入门教程
Git 全局设置:
git config --global user.name "mayue"
git config --global user.email "7656128+ma__yue@user.noreply.gitee.com"
创建 git 仓库:
mkdir testtest
cd testtest
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/ma__yue/testtest.git
git push -u origin "master"
已有仓库?
cd existing_git_repo
git remote add origin https://gitee.com/ma__yue/testtest.git
git push -u origin "master"