使用这个 Linux 技巧始终知道您位于哪个 Git 分支
要点
- 在 Git 中使用分支既快速又简单,我们鼓励经常这样做,作为良好的工作实践。
- 因为这是一个非常琐碎的过程,所以分支的更改并不总是会留在您的脑海中。
- 修改你的命令提示符以自动显示你当前的 Git 分支,这样你就永远知道你所在的分支。
在 Git 中使用分支非常轻松,我们经常这样做。以至于跟踪当前的分支并不容易。有了这个技巧,你就永远不会忘记你当前的分支。
跟踪 Git 分支
分支在版本控制中非常重要。它们使您可以处理新功能或对现有代码进行更改,而不会影响主源代码分支。
与其他版本控制软件相比,在 Git 中使用分支是一件轻而易举的事。创建新分支和更改分支是非常轻量级的过程,因此它们发生在眨眼之间。由于它是如此快速和简单,开发人员往往会经常这样做。
这太容易了。因为 Git 使更改分支成为一件小事,所以您几乎可以像更改目录一样无意识地进行更改。但了解自己所在的分支非常重要。
这个技巧通过在 Bash 命令提示符中显示当前的 Git 分支来提供帮助。最妙的是,如果您当前的目录不包含 Git 存储库,您将看到常规命令提示符。
将 Git 分支作为字符串获取
为此,我们需要能够以插入到命令提示符中的文本字符串形式获取当前的 Git 分支。让我们发出标准 Git 命令来列出存储库中的分支。
git branch
这列出了存储库中的所有分支。当前分支,保存的游戏,带有星号标记。方便的是,它是唯一带有星号的行。这意味着我们可以将 git 命令的输出通过管道传输到 sed,并使用 sed 命令的流操作功能来删除不带星号的行。对于剩下的一行,我们可以使用 sed 删除星号和空格。
git branch | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
这给了我们当前分支的名称。有更简单的方法可以做到这一点,但为了完整起见,以下是该命令的工作原理。
我们发出标准的 git 分支命令。
git branch
输出通过管道传输到 sed。有两个 sed 表达式。第一个表达式删除不包含星号的行。
-e '/^[^*]/d'
第二个表达式从剩下的一行中删除前导星号和空格。
-e 's/* \(.*\)/\1/'
它可以工作,但并不是每个人都熟悉或熟悉 sed。当你在六个月后审视这一点时,它可能有意义吗?我们可以利用 git 和 Bash 来设计一种更简单的方法。
Bash && 运算符让我们将命令链接在一起,以便它们一个接一个地执行。要执行链中的命令,前一个命令必须成功完成。正如我们将看到的,我们可以利用这一点来获得优势。
另一件对我们有利的事情是,从 2.2 版本开始,gitbranch 命令有一个名为 --show-current 的选项。这会单独显示当前分支的名称。
git branch --show-current
这是获取当前 Git 分支的简单名称的更简单方法。唯一的问题是,如果当前目录不包含 Git 存储库,它会生成一条错误消息。因此,如果我们不在 Git 存储库中,我们需要确保该命令不会被执行。
有一个名为 git status 的 git 命令。这会报告 Git 存储库的状态。如果命令失败(就像没有要报告的存储库一样),其退出值为 128。
git status
echo $?
在具有存储库的目录中,其退出值为零。
git status
echo $?
我们可以链接此命令和 gitbranch 命令,因此 gitbranch 命令仅在 gitstatus 命令返回零时执行。我们要做的另一件事是将 git status 命令的所有屏幕输出重定向到 /dev/null,这是一个伪文件,它会默默地消耗发送给它的所有内容。
git status &> /dev/null && echo " $(git branch --show-current)"
cd taf
git status &> /dev/null && echo " $(git branch --show-current)"
我们已经抑制了 git status 命令的所有输出,这正是我们所需要的。在不包含存储库的目录中,没有屏幕输出。在包含存储库的目录中,我们可以看到当前分支的名称。
我们可以让 gitbranch 命令将当前分支的名称按原样写入终端窗口,但通过将其包装在 echo 命令中,我们可以包含一个前导空格。空格会将命令提示符中的分支名称与目录名称分隔开,以便一目了然。
将字符串添加到 Bash 提示符中
我们已经获取了当前 Git 分支的名称,并且有一种方法可以将其输出到屏幕上,并使用前导空格进行格式化。现在我们将把它合并到命令提示符中。
我们将创建一个函数来保存迄今为止创建的命令,并从命令提示符的定义中调用该函数。每当显示命令提示符时,我们的函数就会被调用。
在 Bash 中,命令提示符的定义通常(但并非总是)在 .bashrc 文件中。这是一个隐藏的系统文件,位于您的主目录中。
使用您喜欢的编辑器编辑 .bashrc 文件。
查找定义命令提示符的行。它通常以以下内容开头:
PS1=
在这台 Ubuntu 计算机上,我们想要的行是:
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
在这行下面还有另一行“PS1=”,但它要短得多。如果您阅读 if-then 块中发生的情况,您将看到一个提示用于彩色显示,另一个提示用于单色显示。如果您使用 Git,那么您就是一名程序员。您很快就能弄清楚您需要使用哪个提示。
我们将在 if-then 块上方添加我们的函数。我将其称为 get_git_branch。
它包含我们在命令行上使用的相同命令。我们现在需要确定在命令提示符定义中从哪里调用该函数。
这是提示定义的结束。
\w\[\033[00m\]\$ '
这就是它的组成方式。
\w
当显示命令提示符时,此标记将替换为工作目录。
\[\033[00m\]
这是 ASCII 颜色代码。它将文本颜色设置回白色,以便提示中的美元符号“$”以白色文本显示。
\$ '
这会显示美元符号、空格,然后用单引号结束命令提示符定义。
我们将在“\w”标记之后立即调用我们的函数。我们还将插入一个颜色代码,以黄色显示 Git 当前分支,以使其脱颖而出。这是我们要插入的文本。
\[\033[01;33m\]$(get_git_branch)
请注意,我们插入的文本中没有空格。这就是我们添加的完整命令提示符的样子。
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;33m\]$(get_git_branch)\[\033[00m\]\$ '
保存您的更改并关闭编辑器。关闭终端窗口,然后打开一个新的终端窗口。您将看到正常的命令提示符。导航到包含 Git 存储库的目录。
pwd
cd taf
当前 Git 分支的名称显示为黄色。如果您查看不同的分支,您的命令提示符会立即更改。
git checkout timed-events
它不仅仅适用于 Git
您可以使用此方法来显示可以使用命令行工具收集的任何类型的信息。
例如,如果您创建此函数并从提示符中调用它而不是调用 get_git_branch,您将在提示符中看到时间。
get_time() {
echo " $(date +%r)"
}