使用git开发LHCb软件
学习目标
- 学习如何将特定的LHCb包克隆到本地开发目录
- 学习如何进行修改并上传以供他人审核
前置要求
开始之前,你应该应该应该对git的基本使用有一定了解,类似于入门套件中所教授的内容。
在本课程中,我们将向你展示使用git版本控制系统开发LHCb软件的完整工作流程。在LHCb,我们使用GitLab来管理 git
仓库。除其他功能外,GitLab允许你浏览每个项目的源代码,并通过便捷的网页界面审核新的更改(称为合并请求)。你可以在https://gitlab.cern.ch到CERN的GitLab实例。
原则上,与LHCb软件仓库交互有多种方式:
-
仅使用标准git命令的常规git工作流程。这要求你每次克隆并编译整个LHCb项目。当你的开发预计持续多天或更长时间,或者你与他人协作时,推荐使用这种方法。
-
使用一组
lb-*
子命令的LHCb特定工作流程。这允许你在项目中检出单个包,并简化了对少数包的修改流程。这种方法主要适用于快速且独立的更改(与之前使用的getpack
命令更接近)。
在这里,我们将重点介绍第二种工作流程。
在通过在GitLab中创建项目开始之前,你应该确保本地git配置和GitLab上的设置已充分配置:
你的姓名和电子邮件地址应在本地git配置中设置。为确保这一点,请运行:
$ git config --global user.name "Your Name"
$ git config --global user.email "Your Name <your.name@cern.ch>"
连接到https://gitlab.cern.ch,使用你的CERN凭据登录。
访问https://gitlab.cern.ch/profile/keys并添加SSH密钥。
运行这个LHCb特定的配置命令:
git config --global lb-use.protocol ssh
在GitLab网页界面中,点击"New project"按钮创建一个新项目。给你的项目命名为"LHCbSK"。
我们现在将设置一个本地LHCb开发区域,该区域将连接到你刚刚创建的git仓库。为了创建新的开发环境,运行:
$ lb-dev --list LHCb
$ lb-dev --name LHCbSK LHCb/<version>
git init
来创建一个新的git仓库,并包含一些初始文件(Makefile
、CMakeLists.txt
等)。为了将你的仓库与远程仓库连接,运行:
cd LHCbSK
git remote add origin ssh://git@gitlab.cern.ch:7999/<username>/LHCbSK.git
git push -u origin master
将你的开发项目推送到GitLab
你不一定需要为本地开发项目在GitLab上创建远程git仓库,特别是如果它的生命周期很短的话。但是,如果你计划与他人协作,一个可以同步工作的远程仓库是必不可少的。如果将开发项目用于ganga的GaudiExec,推送到GitLab也是很好的做法。
为本教程的目的,我们已经设置了一个包含TheTestPackage
包的SKTest
项目。为了能够处理SKTest
项目的部分内容,首先运行:
git lb-use SKTest
SKTest
并从GitLab获取git仓库。
然后你可以运行:
git lb-checkout SKTest/master TheTestPackage
SKTest
项目中属于TheTestPackage
包的文件。这在后台执行git checkout
并将文件提交到本地(合成)分支。你可以使用git log
查看历史记录。
现在你可以运行:
make
make
等。你也可以使用:
make test
git add <your-changed-files>
git commit
经常提交
经常提交没有任何代价。每当你完成了可以被视为一个独立更改单元的修改时,都应该尝试创建一个新的提交。
现在将你的更改推送到你新创建的GitLab项目:
git push
当你想要将你的提交上传到SKTest
项目进行审核时,运行:
git lb-push SKTest <username>-new-feature
<username\>-new-feature
分支,并将你的提交上传到该分支。这将计算你的本地开发仓库与远程项目仓库之间的差异,并为远程项目创建相应的提交。现在,你可以通过访问https://gitlab.cern.ch/LHCb-SVN-mirrors/SKTest/merge_requests/new创建一个合并请求,选择<username>-new-feature
分支作为源,master
作为目标。为你的合并请求添加一个标题,并在正文中解释你所做的工作。
合并冲突
- 与合作伙伴一起,尝试通过修改同一个文件来创建合并冲突。如果你没有其他人一起工作,你可以通过创建第二个开发区域来模拟这种情况。
- 现在,尝试解决合并冲突。由于本地仓库的设置方式,这有点复杂。请查看https://twiki.cern.ch/twiki/bin/view/LHCb/Git4LHCb#Replacement_for_svn_update_in_lo 获取提示。
处理整个项目
处理整个项目同样简单,但需要对环境多一点关注。最重要的是,要准备好项目仓库克隆和构建产物可能需要几GB的磁盘空间,并且编译可能需要很长时间。详细的分步指南可在https://twiki.cern.ch/twiki/bin/view/LHCb/Git4LHCb#Building_everything_locally_exam找到。一种更集成的方法可以自动处理环境,链接是https://gitlab.cern.ch/lhcb/upgrade-hackathon-setup,其变体允许你使用一些夜间构建来节省编译许多项目的时间,链接是https://gitlab.cern.ch/lhcb-HLT/trigger-dev。