在Windows命令提示符中显示当前的GIT分支名称

40

在常规的Windows命令提示符中显示当前的git分支名称是否可行?
比如说在Windows 7或10上。


1
git status 显示当前分支在第一行。 git branch -a 列出所有本地分支,当前分支用 * 标记。这是你想要的吗? - Daniel Luz
2
当然不是 :) 你在谈论纯git命令,而我在谈论类似于Linux的bash的win命令提示符。 - CoR
更简单的答案,适用于任何地方:https://dev59.com/SXM_5IYBdhLWcg3wWRoF#1418022 - Joël
7个回答

22

虽然无法在命令提示符中实现,但在PowerShell和Windows终端中是可能的。你甚至可以为终端设置自定义主题。 以下是步骤:

  1. 首先,您需要Git。从Git网站安装Windows版Git。
  2. 然后从“Windows商店”下载“Windows终端”应用程序。它具有多种功能和新特性,您可以在同一窗口上打开多个不同终端的选项卡等等。
  3. 安装“Windows终端”后,使用PowerShell安装“Posh-Git”和“Oh-My-Posh”:(如果您没有NuGet,则需要安装NuGet。如果是这种情况,您的PowerShell命令行将询问是否要安装NuGet。选择[Y]是。您可能还需要批准从PSGallery(一个“不受信任的存储库”)安装模块。选择[Y]是。)
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
  1. 使用notepad $PROFILE打开你的PowerShell配置文件,在文件末尾添加以下代码(这是一个不同于“Windows 终端”配置文件的PowerShell 配置文件,在 PowerShell 启动时会运行此脚本)。如果在此处Set-PoshPrompt命令无效,请尝试使用Set-Theme命令代替(https://superuser.com/questions/1629589/powershell-theming-doesnt-work-set-theme-not-found)。
Import-Module posh-git
Import-Module oh-my-posh
Set-PoshPrompt Paradox
  1. 现在你可能会在终端上看到一些方块字符,因为默认字体不支持它们。(如果你的终端字体没有出现这个问题,可以跳过此步骤) 你需要安装“Cascadia PL”字体以支持这些字符。从Cascadia Code release page下载它们。你需要安装这些字体的特定版本才能支持这些字符:
Cascadia Code PL
Cascadia Mono PL
  1. 在Windows终端中,按下Ctrl+,打开“settings.json”中的Windows终端配置文件,并将以下行添加到“profiles”的“defaults”部分中,如下所示:
"fontFace": "Cascadia Code PL"

如何进入Windows终端设置图片指南

更改字体的位置图片指南

PS 1:如果你想在VS Code等集成终端上做出这些更改,你应该将这行代码添加到VS Code的设置中:

"terminal.integrated.fontFamily": "Cascadia Code PL"

PS 2: 如欲了解更多关于 "Oh-My-Posh" 的信息并更改其主题,请访问 Oh-My-Posh 的 GitHub 页面


来源:

https://learn.microsoft.com/en-us/windows/terminal/tutorials/powerline-setup https://www.hanselman.com/blog/how-to-make-a-pretty-prompt-in-windows-terminal-with-powerline-nerd-fonts-cascadia-code-wsl-and-ohmyposh


如果您发现有用,请接受答案 @CoR - Farid Shokri
1
这对我(Windows 11)有效,但需要注意以下几点:1)必须使用Set-PoshPrompt。2)我不得不重新启动终端几次,因为第一次它没有正确下载。3)我必须猜测ZIP中的哪个字体文件夹要安装,我选择了TTF。4)我不得不重新启动VSCode几次,因为第一次它没有接受字体设置。 - tom
工作正常,但我不得不从配置文件中删除Set-Theme行,因为它在Windows 10上会抛出错误:The term 'Set-Theme' is not recognized as the name of a cmdlet, function, script file, or operable program - Code Spirit
你似乎把终端和Shell混淆了。Windows终端是一个终端,"命令提示符"是一个Shell。Shell运行在终端中。Cmd.exe,普通的命令提示符,确实不支持这个功能,但无论它在哪个终端中运行(新的Windows终端还是旧的conhost),都是如此。 - oisyn
我特别说过在命令提示符中不可能,但由于问题中提到了Windows 10并且有PowerShell(它是一个shell),我认为这个答案就足够了。@oisyn - Farid Shokri
@FaridShokri,你还说在Windows终端中也可以实现,这有点奇怪,因为它只是一个终端仿真器,本身并没有什么作用。你需要在Windows终端中运行PowerShell,但是正是PowerShell使其成为可能。你知道它在打开的conhost中不起作用吗? - oisyn

20

你不能通过基于Windows的“命令提示符”执行此操作。然而,有一个环境可以运行在你的Windows环境之上。

当你运行Git Windows安装程序并允许git安装后,你可以从右键菜单中调用git-bash。

在系统菜单中调用Git Bash

默认情况下,git-bash环境会显示你所在的分支。

运行git-bash环境的截图


我之前在使用Git CMD时无法看到我的分支名称。安装了Git后,自动安装了Git Bash,这样我就能够看到我的分支名称了。 - Michael Kassa
此外,你可以将 Git Bash 集成为 Visual Studio Code 中的默认终端。 - h3nr1ke
这里只是一个注释,我之前一直在使用Git Bash,但由于Git Bash中与Node和Ctrl+C相关的功能目前存在问题,所以我需要使用CMD。 - Zach Pedigo

16

这是我正在使用的git.bat文件。我从以下链接中获取了答案:

https://www.nu42.com/2016/05/display-git-branch-windows-command-prompt.html

首先,在一个文件夹中创建git.bat文件,然后将该文件夹添加到PATH,并位于git.exe行之前(假设您已经在计算机上安装了git.exe)。这样每次您在命令行中键入git时,都会触发新的git.bat而不是git.exe。

@echo off
git.exe %*
set GITBRANCH=
for /f %%I in ('git.exe rev-parse --abbrev-ref HEAD 2^> NUL') do set GITBRANCH=%%I

if "%GITBRANCH%" == "" (
  prompt $P$G 
) else (
    prompt $P $C$E[32;7;32;47m%GITBRANCH%$E[0m$F $G 
)

很好,但在分支名称在提示符上更新之前,需要执行一个git命令。(另外,我无法让git.bat覆盖git.exe) - FractalSpace
1
系统可能会先搜索 .exe 文件而不是 .bat 文件。您可以将 git.exe 重命名为其他名称,然后使用该名称在 .bat 文件中调用正确的 .exe 文件。 - Zach Pedigo

3

如果你正在使用Windows PowerShell,你可以在当前的PowerShell窗口中运行以下命令来覆盖标准的“Prompt”函数。这将使它检测Git仓库并在提示字符串中列出Git分支:

Original Answer翻译成"最初的回答"

Function Prompt
{
    $git_cmd = "git rev-parse --abbrev-ref HEAD"
    Invoke-Expression $git_cmd 2> $null | Tee-Object -Variable git_branch | Out-Null
    $git_branch_text = $None
    if ( $git_branch -And -Not $git_branch.StartsWith($git_cmd)) 
    {
        $git_branch_text = "[$git_branch] "
    }

    $stringBuilder = New-Object System.Text.StringBuilder
    $null = $stringBuilder.Append("PS ")
    if ($git_branch_text) { $null = $stringBuilder.Append($git_branch_text) }
    $null = $stringBuilder.Append($($executionContext.SessionState.Path.CurrentLocation))
    $null = $stringBuilder.Append($('>' * ($nestedPromptLevel + 1)))
    $null = $stringBuilder.Append(" ")
    return $stringBuilder.ToString()
}

PS C:\Users\username\Document\GitHub>
PS C:\Users\username\Document\GitHub>cd code_repository
PS [dev] C:\Users\username\Document\GitHub\code_repository>

PS [dev] C:\Users\username\Document\GitHub\code_repository>cd ..
PS C:\Users\username\Document\GitHub>

在PowerShell版本5.1.17763.592上进行测试。

要在所有PowerShell命令窗口中应用此提示更改,请将此函数放入名为profile.ps1的文件中,该文件位于C:\Users\username\Documents\WindowsPowerShell中。 之后打开的任何PowerShell命令窗口都应该在Git存储库目录中时具有Git提示。

最初的回答:


1
请参见 https://dev59.com/i3M_5IYBdhLWcg3wp06l - DocOc

2

是的,你可以。你可以创建一个脚本并将其命名为'gb.bash',然后添加以下代码:

@echo off
set GITBRANCH=
for /f "tokens=2" %%I in ('git.exe branch 2^> NUL ^| findstr /b "* "') do set GITBRANCH=%%I

if "%GITBRANCH%" == "" (
    prompt $P$G 
) else (
    prompt $P $C$E[10;7;32;47m%GITBRANCH%$E[0m$F $G 
)

然后进入您的环境变量并将包含此脚本的文件夹添加到您的路径中。

有了这个设置,只需在git仓库中打开终端并输入命令'gb',就会将分支名称放在您当前所在文件夹的路径上。

目前,这个解决方案要求您手动输入'gb'命令来触发脚本。但是,我相信也有一种方法可以在启动CMD时自动触发脚本。我会在某个时候研究并更新这个答案。

我从这两个来源获得了解决方案:

在Windows命令提示符中显示git分支

在Windows命令提示符中显示git分支

免责声明:切换到新分支后,您必须执行'gb'以更新显示的分支名称。


1

我正在使用babun(已停用)
它为git提供了一个很棒的命令行视图。 它还支持上下文菜单,并且可以在任何位置通过右键单击打开。

snapshot


1
仅供参考,Babun已经停止开发。链接 - h3nr1ke
1
是的,可悲的是 :( ,又一款最好的软件停止了更新。但仍然可以毫无问题地继续使用它。 - dkb
Babun是一个“预配置的Cygwin”。因此,“git bash”也可以使用。请参见其他答案。--我大多数时间都在使用WSL2。我的提示是使用Oh My BASH!来调整bash。 - koppor

0

@Farid Shokri的说法并不完全正确

不是在命令提示符中,而是在PowerShell中[...]

虽然没有本地方法,但您可以使用AutoRunDoskeyPrompt和自定义批处理脚本来自定义cmd行为。

解决方案

  1. 创建一个批处理脚本 cd-git.bat(见下文)。我们将其放在 C:\Apps 中。

  2. 创建一个 AutoRun 字符串值(任选其一)

    • HKLM\Software\Microsoft\Command Processor\AutoRun
    • HKCU\Software\Microsoft\Command Processor\AutoRun

    字符串值:

    if exist C:\Apps\cd-git.bat doskey cd=C:\Apps\cd-git.bat $*
    

cd-git.bat

@echo off
CD %*
where git >nul 2>&1
if %errorlevel% neq 0 (
    goto :eof
)
for /f "usebackq tokens=* delims=" %%g in (`git rev-parse --is-inside-work-tree ^>nul 2^>^&1 ^&^& git branch --show-current`) do (
    set branchname=%%g
)
if "%branchname%"=="" (
    prompt $p$_$$$s
) else (
    prompt $p $c$e[36m%branchname%$e[0m$f$_$$$s
)
set branchname=

结果

示例:启动一个新的命令行窗口并导航到一个Git代码库。

Microsoft Windows [Version 10.0.19041.2673]
(c) Microsoft Corporation. All rights reserved.

C:\Users>cd \Develop\git-test

C:\Develop\git-test (main)
$ cd ..

C:\Develop
$

当你使用cd进入一个git仓库目录时,它的当前分支将在括号内显示。

解释

  • AutoRun条目通过使用doskey命令为cd命令创建一个新的别名(宏),但仅在我们的自定义批处理脚本cd-git.bat存在时才会创建。
  • doskey cd别名确保使用cd时执行cd-git
  • cd-git
    1. 最重要的:进入所请求的目录。
    2. 检查是否有可用的git命令。
    3. 如果有,则检查当前目录是否有分支名称。
    4. 如果有,则更改提示以显示分支名称。

参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接