从git到opengl项目管理

git

git是什么?维基百科上的解释是这样的:

git是分布式版本控制软件,最初由Linus创作。

通俗来说它是一个 “月光宝盒”,有版本回溯和创建平行时空的能力:

  • 每次修改代码都有记录,可以方便地回退

  • 可以从主干中创建分支,修改分支后与主干合并

  • 本地修改可以推送到云端,这样方便保存和拉取代码

总而言之,git方便了程序员去管理代码和团队协作。

最小化使用git

git这个软件是开源的,但需要一个存储代码的云端,知名的代码托管平台是 github, gitlab 和 gitee

gitee 网址:https://markdown.com.cn

注册之后,需要在"设置->邮箱管理"里绑定一个邮箱,系统会发送一个验证的邮件,点击链接验证。

为了保护隐私,务必把下面的选项勾上:

alt text

点击右上角+号,可以新建一个仓库。请记住,一个仓库下载到本地就是的一个文件夹,文件夹名称就是你设置的仓库名。因此第一次取名时要慎重。

远端新建好了一个仓库,那怎么往上面传代码?

git的基础工作流是这样:

  • 选一个文件夹初始化git

  • 添加和修改代码,add,commit保存记录

  • push推送到远端

一些git命令:

  1. 初始化git文件夹

    git init:在当前文件夹下新键.git文件夹,git开始追踪文件夹下的文件。首次配置时使用。

  2. 添加一次修改记录

    git add .:添加文件夹下所有文件至暂存区。

    git commit -m "First commit":生成一次修改记录,记录add的文件。

  3. 推送至远端

    git push:把commit的修改同步至远端。

  4. 从远端同步

    git pull:从远端拉取。

  5. 切换分支

    git checkout -b branchname:创建并切换至一个新的分支。

  6. 查看当前分支

    git branch

    项目有一个默认的主干,为mastermain,修改这个branch时要慎重。一般的做法是,checkout签出一个新分支,在这个新分支上修改代码,测试后再合并到主干。

  7. 首次推送新分支

    git push -u origin 分支名:新创建的分支无法直接 git push,需首次在远端指定

  8. 删除分支

    git branch -d 分支名:分支合并后,不需要了可以在本地删除。

    git push origin --delete 分支名 :上面的命令只是删除本地分支,这个命令删除远程分支。

其他:

  • 配置用户名和邮箱

    1
    2
    
    git config user.name "你的用户名"
    git config user.email "你的邮箱"
    
  • 查看git状态

    git status

  • 删除远程文件,本地不删除

    1
    2
    
    git rm --cached 文件名
    git rm -r --cached 文件夹
    

用git管理OpenGL项目

个人认为,即便是完成计算机图形学的课程作业,使用git来管理 opengl 的代码是有必要的。

特别是对于小组多人协作,你永远无法想象别人会把头文件放在什么位置。这就导致代码发给别人,无法直接运行。

相比于VSCode,VS2022最方便的点在于,可以直接点开 .sln 文件,就会自动加载整个解决方案,里面的多个项目可以直接运行。git可以充分利用这个优势,让小组成员开发代码的效率堪比火箭。

使用git来管理opengl项目,应该要做到以下几点:

  • 大家共用相同的头文件和类,并且在源代码的导入路径一致。

  • 第三方lib每个人不一样,但也应当放在相同的文件夹。这样在项目里指定的文件夹保持一致。

  • 每个人有自己的解决方案的文件夹,自己的项目全放在下面。别人打开自己的 .sln,稍加设置后也能运行。

项目结构

opengl最难管理的就是各种库,包括头文件include,和lib等,以及自己写的类。

项目结构如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
📂 git根目录
  📂 src
    📄 main.cpp
    📄 utils.cpp
  📂 include
    📂 assimp
    📂 glfw
    📄 unils.h
  📂 shaders
  📂 Projects
    📂 Dingzhen
        📂 项目1
        📄 Dingzhen.sln
  📄 README.md
  📄 .gitignore

VS每个项目都要指定项目属性,包括头文件的路径,依赖库的路径,这些都可以用一个props文件来配置,每个项目新建时和运行别人的项目时导入即可。

一个props文件示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<Project>
  <ItemDefinitionGroup>
    <ClCompile>
      <AdditionalIncludeDirectories>
        $(SolutionDir)..\..\include;
        %(AdditionalIncludeDirectories)
      </AdditionalIncludeDirectories>
    </ClCompile>

    <Link>
      <AdditionalLibraryDirectories>
        $(SolutionDir)..\..\thirdLibrary\glfw-3.4\libs;
        %(AdditionalLibraryDirectories)
      </AdditionalLibraryDirectories>
      <AdditionalDependencies>
        glfw3.lib;
        opengl32.lib;
        %(AdditionalDependencies)
      </AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
</Project>

最好是所有人共用一个props,某个项目有特殊配置,单独写一个props

VS的许多导入机制不是简单的复制文件,而是引用。原文件一旦修改,引用这个文件的部分也会生效。

工作流程

  • 签出分支

    所有人一定要保证主分支的干净,不要让多余的文件提交到仓库! 下面几种情形,一定要创建并切换到新的分支进行:

    • 我要运行和调试代码(无论别人的还是自己的),并加入新的依赖。

    • 我要写新的类,需要新增 .h.cpp 文件

    • 我要使用新的模型文件

  • 新增项目

    在自己的解决方案文件夹里新建项目,每个项目导入props文件,一键配置好依赖。新写的类在自己的项目里测试,完成后放到公共的include文件夹。

  • 运行别人的项目

    直接点开.sln文件,可能要配置props,运行

  • 增加依赖库

    不用编译的头文件直接放include文件夹,根据自己电脑编译出来的产物放 thirdLibrary

  • 推送分支

    把分支提交到远程,发起 pull request

类的实现文件

类的实现文件 .cpp,.c文件放在src文件夹下,在每个项目的解决方案视图里的头文件里添加现有项。

`.cpp`文件不能向头文件那样直接指定目录,需要在VS里导入,在编译期才会参加编译。

大体积资源文件

opengl项目涉及的纹理、贴图、模型的文件体积都较大,glb 文件更是动辄几种兆。大文件 不适宜使用git管理,不要把它们提交到仓库。幸运的是,这些文件整理好能使用之后,不会再次修改(没有建模的实力)。

在和gpt一番智斗后,有了下面的思路:

1
2
3
4
   仓库里保存下载链接的文本文件
==> 从网盘下载
==> 解压到指定位置
==> 源代码里使用相同的导入路径

可以用一个json文件保存文件信息,包含文件名,类型,最重要的下载链接。脚本读取到json文件后,按url索取模型文件,放在同级目录里。又一番跟AI智斗后,它给了一个自动遍历json文件,自动下载的python脚本。

Licensed under CC BY-NC-SA 4.0
最后更新于 2025年12月24日 19:59
使用 Hugo 构建
主题 StackJimmy 设计