Git 使用过程中遇到的问题整理

一、本地文件夹存在,但 GitHub 上没有上传

展开

问题现象

本地存在如下目录:navigation_system_ws/src/livox_ros_driver2

但执行 git push 后:

  • GitHub 仓库中看不到该文件夹
  • 本地确认文件真实存在

排查过程

1. 检查是否被 .gitignore 忽略

Terminal window
1
git check-ignore -v livox_ros_driver2

如果输出类似:.gitignore:12

/

说明该目录被忽略。

👉 本次排查中未被忽略。

2. 查看 Git 状态

在仓库根目录执行:

Terminal window
1
git status

输出:

1
位于分支 master
2
3
未跟踪的文件:
4
(使用 "git add <文件>..." 以包含要提交的内容)
5
6
navigation_system_ws/src/livox_ros_driver2/
7
8
提交为空,但是存在尚未跟踪的文件

说明:

该目录尚未被 Git 跟踪(未执行 git add)。

3. 尝试添加后出现警告

执行:

Terminal window
1
git add .

出现提示:

1
正在添加嵌入式 git 仓库:livox_ros_driver2

并提示:

1
You've added another git repository inside your current repository

问题根因

livox_ros_driver2 本身是一个独立的 Git 仓库:

1
livox_ros_driver2/
2
├── .git
3
├── package.xml
4
├── CMakeLists.txt
5
└── ...

属于嵌套 Git 仓库(nested git repository)。

Git 不会自动将其当作普通目录提交。


正确解决方案:使用 Git Submodule

第三方驱动 / SDK 正确的管理方式应为 submodule。

添加 submodule:

Terminal window
1
git submodule add https://github.com/Livox-SDK/livox_ros_driver2.git \
2
navigation_system_ws/src/livox_ros_driver2

clone 项目时:

Terminal window
1
git clone --recurse-submodules git@github.com:xxx/Car_AMR.git

或:

Terminal window
1
git submodule update --init --recursive

更新代码时:

Terminal window
1
git pull --recurse-submodules

小结

submodule 只记录:

  • 仓库地址
  • 指定 commit

不会复制源码进主仓库。

非常适合管理第三方依赖(ROS 驱动 / SDK / 算法库)。


二、Git 中存在多个 remote(1111 / github)

展开

问题现象

在 Git 提交图中看到: 现象图片

1
1111/master
2
github/master

看起来像是:

有两个 GitHub 仓库。


实际原因

这是多个 remote 指向同一个仓库地址导致的。

查看:

Terminal window
1
git remote -v

看到:

1
1111 git@github.com:wdxzf/Car_AMR.git (fetch)
2
1111 git@github.com:wdxzf/Car_AMR.git (push)
3
github git@github.com:wdxzf/Car_AMR.git (fetch)
4
github git@github.com:wdxzf/Car_AMR.git (push)

说明:

  • 1111github 只是远程仓库别名
  • 实际 URL 完全相同

正确清理方式

删除无意义的 remote:

Terminal window
1
git remote remove 1111

推荐统一命名为 origin

Terminal window
1
git remote rename github origin

最终效果:

1
origin git@github.com:wdxzf/Car_AMR.git (fetch)
2
origin git@github.com:wdxzf/Car_AMR.git (push)

建议规范

类型命名
主仓库origin
上游仓库upstream

避免使用无意义命名(如 1111test)。


三、总结

本次问题主要涉及两个 Git 中高级概念:

  • Submodule(子模块)
  • Remote(远程仓库别名)

它们是大型工程(ROS / 自动驾驶 / 多仓库项目)中必不可少的 Git 技能。

掌握后可以有效避免:

  • 文件“明明存在却无法提交”
  • 仓库结构混乱
  • 第三方依赖无法同步
  • clone 后项目不完整

经验结论

第三方代码一定不要直接拷进仓库。

能用 submodule 的,一定用 submodule。