1、Git子模块
在工程构建中,往往存在一些通用模块或功能稳定、特定用途的模块。推荐将这类模块独立为一个 Git 仓库进行管理。使用时,可以将其作为 Git 子模块导入主工程,主工程仅需记录子模块对应的 commit id,即可实现版本锁定与依赖管理。
1.1 给现有工程加入子模块
有一个工程Project,我想在Project/lib目录下加入一个模块moduleA,这个模块在git上是现成的,可以直接拿来用,这个时候有以下两个选择:
- **方法A:**直接把模块下载下来放到
Project/lib/moduleA目录下- **方法B:**把这个模块作为子模块存放
Project/lib/moduleA目录下,实际只记录一个commit id
先说优劣:
方法A很直观,直接复制拷贝工程源码,大部分人一开始都是这么做的,好理解也方便,但是这种方法无法和原来仓库建立联系,后期有更新了也不能感知到,如果作为基础模块,项目中很多地方使用,而且这个模块后期经常变动不建议用这种方法,如果模块几乎不会变动,建议使用这种方法。
方法B相关麻烦一些,初学者容易操作失误,但是适用于经常升级的模块,具体操作如下:
python
# 进入要加子模块的目录下
cd Project/lib
# 给当前工程加子模块,源码自动存放到moduleA文件夹中
git submodule add http://192.168.1.100:8888/common/docker_image/moduleA ./moduleA
# 如果这个子模块内部还嵌套有其它子模块
cd moduleA
git submodule update --init --recursive
1.2 github仓库改成gitlib子仓库方法
个人代码在gitlib仓库,但是其中某个功能实际上是github上的仓库,提交代码的时候,提示我有子仓库。这时有两个选择:
1、直接删掉github相关信息,将代码合并到当前工程,当然这样简单粗暴,但是丢失相关提交记录
2、将github地址改成gitlib地址,然后作为子模块被当前工程管理
方法1操作方法:
python
rm -rf /home/sam3/code/SAM3-TensorRT/.git
git rm --cached code/SAM3-TensorRT
git add code/SAM3-TensorRT/
方法2的操作步骤如下:
第 1 步:在你的 GitLab 上创建空项目
在 GitLab 上新建一个空仓库(如 sam3-tensorrt),不要勾选初始化 README。记下地址,格式类似:
python
git@your-gitlab.com:your-group/sam3-tensorrt.git
第 2 步:推送到你的 GitLab
python
cd /home/sam3/code/SAM3-TensorRT
# 添加你的 GitLab 作为新 remote
git remote add gitlab git@your-gitlab.com:your-group/sam3-tensorrt.git
# 推送所有分支和标签到你的 GitLab
git push gitlab --all
git push gitlab --tags
第 3 步:转为 submodule
python
cd /home/sam3
# 1. 先从 git 暂存区移除(不删文件)
git rm --cached code/SAM3-TensorRT
# 2. 删除内层 .git 目录(submodule 会通过自己的方式管理)
rm -rf code/SAM3-TensorRT/.git
# 3. 临时移走目录(submodule add 要求目录不存在或为空)
mv code/SAM3-TensorRT /tmp/SAM3-TensorRT-backup
# 4. 添加 submodule(用你的 GitLab 地址)
git submodule add git@your-gitlab.com:your-group/sam3-tensorrt.git code/SAM3-TensorRT
# 5. 恢复你的本地改动(如果有未提交的修改)
cp -r /tmp/SAM3-TensorRT-backup/* code/SAM3-TensorRT/
# 完成后 .gitmodules 文件会自动生成:
[submodule "code/SAM3-TensorRT"]
path = code/SAM3-TensorRT
url = git@your-gitlab.com:your-group/sam3-tensorrt.git
后续使用
python
# 克隆主仓库时自动拉取子模块
git clone --recurse-submodules <主仓库地址>
# 已有仓库更新子模块
git submodule update --init --recursive
# 同步上游更新(将来需要时)
cd code/SAM3-TensorRT
git fetch origin # 从 GitHub 上游拉取
git push gitlab main # 推到你的 GitLab
2、代码回退
2.1 场景1
修改了一个文件
onnx_inference.cpp,提交到Git,对应的commitid是199fa20*, 但是因为某些原因我发现我没有必要修改这个文件,我想回退到上个版本对应的代码,应该怎么操作?
Git命令如下:
C++
git restore --source=199fa20^ -- src/onnx_inference.cpp
执行完命令打开onnx_inference.cpp和远端仓库代码对比,代码已经变成这次提交前的状态,只需要再提交一次覆盖本地提交即可。上面命令的详细解释如下:
| 参数 | 含义 |
|---|---|
| git restore | Git 命令,用于恢复工作区文件到某个状态 |
| --source=199fa20^ | 指定恢复的来源。199fa20 是提交哈希,^ 表示"该提交的父提交",即 199fa20^ = 199fa20 的前一个提交 |
| -- | 分隔符,表示后面的参数都是文件路径,防止路径被误解为选项 |
| src/onnx_inference.cpp | 要恢复的文件路径 |
通俗理解:
C++
git restore --source=<从哪里恢复> -- <恢复哪个文件>
这个命令的意思是:从提交 199fa20 的父提交中,恢复 src/onnx_inference.cpp 文件到当前工作区。
3、常规命令
获取代码的git仓库地址
忘记仓库远端地址,可以通过下面命令查看:
python
git remote get-url origin
待补充...