在开源社区中提交 Pull Request

黎 浩然/ 25 8 月, 2023/ 计算机/COMPUTER/ 0 comments

本文以A-Ops项目为例,演示如何向开源社区提交Pull Request。

https://gitee.com/openeuler/A-Ops

环境准备

安装git程序

yum install -y git

使用yum(Yellowdog Updater, Modified)包管理器在基于RPM的Linux发行版(如OpenEuler CentOS、RHEL、Fedora等)上安装软件。这里的命令用于安装Git,Git是流行的版本控制系统,广泛用于软件开发中管理源代码。下面是命令的详细解释:

全局配置git

git config --global user.name "your Gitee Name"
git config --global user.mail "email@your_Gitee_email"

将your Gitee Name和email@your_Gitee_email替换为gitee id和gitee绑定的电子邮箱

配置Git的全局设置,特别是设置提交代码时使用的用户名和电子邮件地址。这些配置是存储在Git 配置文件中的,通常位于用户的主目录下的.gitconfig文件中。以下是对这两条命令的详细解释:

git config --global user.name "your Gitee Name":

  • git config这是Git命令行工具的一个组成部分,用于读取和写入 Git 配置变量;
  • --global这个选项指示Git将这个设置应用到当前用户的所有仓库。如果不加此选项,设置只会应用到当前仓库;
  • user.name这是Git配置中的一个变量,用于定义提交代码时使用的用户名;
  • "your Gitee Name"这里应替换为您的 Gitee 用户名或者您希望在提交中显示的名字。

git config --global user.mail "email@your_Gitee_email":

  • user.mail这是另一个Git配置变量,用于定义提交代码时使用的电子邮件地址。
  • "email@your_Gitee_email"这里应替换为您的Gitee关联电子邮件地址或您希望与您的提交关联的电子邮件。

配置SSH公钥

生成ssh到rsa密钥对:

ssh-keygen -t rsa -C "email@your_Gitee_email"
cat ~/.ssh/id_rsa.pub

将email@your_Gitee_email替换为gitee绑定的电子邮箱。

ssh-keygen -t rsa -C "email@your_Gitee_email"

  • ssh-keygen: 这是一个用于生成、管理和转换认证密钥的工具,广泛用于 SSH 应用中;
  • -t rsa: 指定生成密钥的类型,这里使用的是RSA算法。RSA是目前最常用的公钥算法之一;
  • -C "email@your_Gitee_email": 这个选项用于添加一个注释,通常是用户的电子邮件地址,方便识别密钥的所有者。这里应替换为您的实际电子邮件地址。

在Gitee网页点击右上角的“个人头像”进入个人Gitee账户,并点击个人头像下的“个人设置”,进入个人设置页面。在“个人设置->安全设置”下,点击“SSH公钥”,在“添加公钥”内把cat命令获取到的ssh公钥添加进去。对于使用Git的开发者,将SSH公钥添加到Gitee、GitHub等服务,可以无密码推送代码更改。

在本地openEuler上完成gitee在SSH上的登记

ssh -T git@gitee.com

这条命令用于测试SSH连接到Gitee的配置是否正确。这个命令通过SSH协议尝试与Gitee的服务器进行非交互式登录,主要用来验证您的SSH密钥是否已经被Gitee接受和配置正确。以下是对命令的详细解释:

  • sshSecure Shell (SSH)是一个用于安全远程登录和其他网络服务的协议。这个命令用于启动一个到指定主机的SSH连接;
  • -T:这个选项告诉SSH客户端不要为这个连接分配一个伪终端。这通常用于执行自动化的脚本操作,因为它避免了可能干扰脚本执行的额外的交互式功能;
  • git@gitee.com:这部分指定了登录的用户名和服务器。在这里,git是Gitee服务器上用于接受Git操作的专用账户,gitee.com是服务器的地址。

如果获得如下“成功”提示,则表示 ssh 公钥已经生效:Hi $user_name! You’ve successfully authenticated, but GITEE.COM does not provide shell access.

编写代码

Fork官方的A-Ops仓库到自己仓库

登录自己的gitee账号,然后在浏览器中打开openEuler的A-Ops仓库gitee页面,点击右上角forked,按照指引将openEuler的A-Ops仓库fork到自己的仓库中。然后可以在自己的gitee主页看到该仓库:

拉取自己仓库的A-Ops代码到本地

我们需要在自己A-Ops仓库中做修改,然后在向openEuler的A-Ops仓库提交Pull Request。因此需要先拉取自己仓库的A-Ops到自己的openEuler机器上来编写代码:

创建一个工作目录并进入该目录:

mkdir A-Ops-Working
cd A-Ops-Working

拉取自己仓库的A-Ops到本地openEuler机器:

git clone <https://gitee.com/li-haoran-ernest/A-Ops>

将li-haoran-ernest替换为自己的gitee用户id,下同。

设置本地工作目录的 upstream 源(被 fork 的上游仓库)为openEuler的A-Ops仓库。

git remote add upstream https://gitee.com/openEuler/A-Ops

这条命令用于在现有的Git仓库中添加一个新的远程仓库引用,名为upstream。这通常用于与一个上游仓库同步,特别是在参与开源项目时,你可能需要从项目的原始仓库(上游)获取最新的更改,并与你的分支保持同步。以下是对命令的详细解释:

  • git remote add: 这是 Git 的一个命令,用于添加一个新的远程仓库引用;
  • upstream: 这是新远程仓库引用的名称。在 Git 社区中,upstream 通常用于指代原始仓库,而你的个人分支或复制(fork)称为 origin
  • https://gitee.com/openEuler/A-Ops: 这是远程仓库的 URL。这里使用的是 Gitee 平台上的一个仓库地址,你应该替换这个 URL 为实际你需要同步的仓库 URL。

一旦设置了上游仓库,你可以使用git fetch upstreamgit pull upstream master(假设你要同步的是master分支)来更新本地仓库。如果你刚开始使用Git或不确定当前目录是否为 Git 仓库,可以通过运行git status来检查。如果当前目录不是一个仓库,命令将会报错。

保持您的分支和master的同步

为了尽量在合并代码的时候产生冲突,在你尝试修改代码前可能官方的代码已经发生变化。因此在你开始修改代码前,应该保持您的分支和openEuler官方的master的同步。

git fetch upstream
git rebase upstream/master

第一条命令:git fetch upstream

  • git fetch upstream:这个命令从名为upstream的远程仓库获取所有的分支和标签,但不自动合并或修改你的当前工作。这只是下载数据到你的本地仓库,使之与上游仓库保持同步;
  • 功能:该命令确保你有上游仓库的最新信息,但不改变你的工作目录的内容。

第二条命令:git rebase upstream/master

  • git rebase:这个命令将本地当前分支的基点移至上游仓库的master分支的最新提交上。这意味着它会取出当前分支上做的所有提交,并重新在upstream/master的顶部逐一应用它们;
  • upstream/master:这是上游仓库的master分支,你将要以它为基底来重排你的分支。

在执行git rebase时可能会遇到冲突,需要手动解决这些冲突,然后继续rebase过程。Rebase可以改变提交历史,所以最好只在尚未推送到远程分支的本地提交上使用它,避免在公共分支上使用,因为它可能会给其他协作者带来问题。

在本地工作目录提交修改

git add /path/to/yourfile

将修改后的文件添加到暂存区(stage)。暂存区是一个中间层,用来存放即将被提交的文件更改。这使得你可以在进行最终提交前,选择性地添加文件的改动。以下是对这个命令的详细解释:

  • 开发中的代码更改: 在你对项目文件做了修改(例如修复了一个 bug 或添加了一个新功能)后,使用 git add 命令将这些更改加入暂存区;
  • 逐步提交: 如果你一次更改了多个文件,但想要将它们分开提交以保持提交历史的清晰和有意义,你可以使用 git add 分别添加每个文件或一组相关文件;
  • 通配符和目录: 你也可以使用通配符(如 *.txt)来添加特定类型的文件,或者直接添加目录来包括目录下的所有更改;
  • 查看状态: 在使用 git add 之前,你可以使用 git status 命令来查看哪些文件被修改了但还没有暂存。

不要add那些编译程序过程及编译后生成的文件,它们不应该被提交。例如可执行文件和vmlinux.h

例如我的第一个pull request的编写代码过程我只add以下这些文件:

git add /src/probes/system_infos.probe/system_cpu.h
git add /src/probes/system_infos.probe/system_cpu.c
git add /src/probes/system_infos.probe/system_cpu.meta
git add /src/probes/system_infos.probe/system_infos.h

你可以通过git status命令查看目前修改或新增了哪些文件。再次:编译程序过程及编译后生成的文件,它们不应该被提交:

git status

在add之后,你可以commit你的代码了:

git commit -m "提交原因"

您可能会在前次提交的基础上,继续编辑构建并测试更多内容,可以使用 git commit –amend 继续修改上次的提交,避免太多次提交。并且,当你在提交pull request后需要继续修改代码时你也需要用到该命令。

将变更推送到你的仓库

git push -f origin master

使用push命令后,输入你的gitee的id和密码,你本地的commit就会被推送到自己的A-Ops仓库中。将本地仓库的更改强制推送(force push)到远程仓库,具体是推送到名为 origin 的远程仓库的 master 分支。以下是对这个命令的详细解释:

现在,你可以在你自己的仓库看到自己的提交了:

提交合并

在决定提交pr到官方社区的仓库时,点击你的主页的Pull Request:

源分支为你的master分支,目标分支为官方的master分支:

点击确认后,将会在openEuler的A-Ops仓库的Pull Request列表中开启一个讨论串。在这里,一些自动的工具(代码门禁)和官方的人员会审核你的代码。

你在不断完善自己的代码后,最终他们或将你的代码合入官方的代码中。

每次修改后可以使用:

git commit --amend

git commit --amend 是一个非常有用的Git命令,它允许你修改最后一次提交。这个命令通常用于修正最后一次提交的错误,如忘记添加某些文件到提交中,或者需要更改提交信息,避免太多次提交。然后使用

git push -f

命令强制推送你的修改。如果你已经将原始提交推送到远程仓库,使用 git commit --amend 后,直接推送可能会被拒绝,因为历史不同。这时,你可能需要使用 git push --force 或与团队协商一个合适的解决方案。

Share this Post

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

*
*