Git for Windows(Git Bash)中的软件包管理?

97

我正在阅读git-for-windows的github wiki,它说msys2捆绑了pacman:https://github.com/git-for-windows/git/wiki/Package-management

但是当我调用它时,我得到:

$ pacman
bash: pacman: command not found

有人知道发生了什么吗?

此wiki是指哪个git版本?

在Git for windows中是否有一种方法可以安装额外的msys2软件包?


1
WeiHua Liu的下面的回答似乎比我2015年的回答更精确和最新。 - VonC
8个回答

67
问题397中所述:

这是有意的。我们没有在Git for Windows中附带pacman。
如果您想要一个完整的包管理器维护的环境,可以尝试使用Git for Windows SDK

您在最新的Git for Windows(2.5.3)中看到的bash是一个比旧版msysgit更为先进的bash,仅用于执行git命令。
它不是一个完整的Linux环境,无法安装任何第三方软件包。

警告: dhj评论区中报告:

不要使用目录链接将现有的git for windows与msys2主系统连接起来。
如果您卸载它,它会认为链接的目录属于它,并删除您的整个主目录,包括“下载”等子目录。
小心处理msys2。

我不知道对于git for windows SDK是否也是如此,但尝试将pacman从其他系统集成到git for windows时请注意。


8
是的,我并不指望从Git Bash中获得完整的Linux体验,但安装一些命令行实用程序可以让在Windows环境下工作更加轻松。我尝试了Git for Windows SDK,似乎这正是我想要的。感谢您的提示。 - carbolymer
4
您可以手动提取Git for Windows SDK安装程序,并编辑“install”脚本setup-git-sdk.bat以限制安装的软件包(排除Python和Mingw构建工具)。这样可以减小安装文件的大小,但仍然允许您使用pacman升级现有软件包并安装其他软件包。但是,您需要从Git for Windows安装中复制git-bash.exegit-cmd.exe(还有其他文件?)。 - Brecht Machiels
@BrechtMachiels 好的,我会在https://dev59.com/818f5IYBdhLWcg3wHfg_#nNHonYgBc1ULPQZFEPXW上关注您的问题。 - VonC
2
注意。不要使用目录链接将您现有的git for windows与msys2主系统连接起来。如果您卸载它,它将认为链接的目录属于它,并删除您的整个主目录,包括“下载”之类的子目录。小心处理msys2。我因失去了太多而感到非常恶心。我不知道是否对于git for windows SDK也是如此,但是在尝试将pacman从其他系统集成到git for windows时要小心。 - dhj
1
@dhj 感谢您的反馈:我已经将您的评论/警告包含在答案中,以增加其可见性。 - VonC
显示剩余8条评论

45

Git for Windows (https://gitforwindows.org/https://git-scm.com/downloads) 包含 Git Bash 但不包括 tree

tree 可以通过 pacman(软件包管理器)获得,但只有当您安装了“Git for Windows SDK”时才可用(请在 https://gitforwindows.org/ 滚动到底部,提供一个链接以从https://github.com/git-for-windows/build-extra/releases/latest下载其安装程序)

这个被接受的答案 非常有帮助。他们提到 git-for-windows 并不打算在默认安装中包含 pacman

所以我安装了“Git for Windows SDK”,然后在它的 bash 提示符(SDK-64)中运行了以下命令来安装当前的 tree 版本v1.7.0-1(截至本文发布日期2018年8月30日):

[SDK-64: Bash Terminal for Git for Windows SDK]
pacman -S tree
...
Proceed with installation? [Y/n] Y

在我的系统上,Git for Windows SDK被安装在C:\git-sdk-64目录下。因此,我从我的Git for Windows Bash shell(其中没有安装tree)中将tree.exe复制到/usr/bin目录下,例如:

[MINGW64: Bash Terminal for Git for Windows]
cd /usr/bin
cp /c/git-sdk-64/usr/bin/tree.exe .

现在我可以在两个 Git Bash shells 中运行 tree v1.7.0。

为了让其他人更容易使用,也为了方便以后的自己,我查看了在我的 Git for Windows SDK Bash 终端中通过运行以下命令获取 tree 包的位置:

$ pacman -S --info tree
Repository      : msys
Name            : tree
Version         : 1.7.0-1
Description     : A directory listing program displaying a depth indented list of files
Architecture    : x86_64
...

关键在于pacman从"msys"存储库获取tree(FYI:即使它说是msys,它实际上使用的是msys2),所以我查看了/etc/pacman.d/mirrorlist.msys,第一个镜像指向http://repo.msys2.org/msys/$arch/

因此,下次您想要从Git for Windows中没有的软件包,您可以从http://repo.msys2.org/msys/x86_64/(64位)或http://repo.msys2.org/msys/i686/(32位)下载它们。

例如:tree v1.7.0-1的直接下载链接

FYI:Git SCM的Windows下载地址为https://git-scm.com/download/,它从Git for Windows GitHub(https://github.com/git-for-windows/githttps://github.com/git-for-windows/git/releases/链接)拉取最新版本。


2
如果你下载了软件包文件,你仍然需要使用 pacman 来正确地安装它,对吗?Windows 版本的 Git 不包含或支持 pacman ... 除非你使用了包含 pacman 的 Git for Windows SDK,但这种安装方式不能与常规的 Git for Windows 安装相集成。 - Mister_Tom

22

我不想更改我已经安装好的Git for Windows,所以我进行了一些 improvisation:

  1. 在其他地方安装Git for Windows SDK。你需要超过3GB的可用空间。
  2. ${git-sdk}/usr/bin/pacman.exe 复制到 ${git}/usr/bin
  3. ${git-sdk}/etc/pacman.conf${git-sdk}/etc/pacman.d 复制到 ${git}/etc
  4. ${git-sdk}/var 复制到 ${git}/

现在你可以打开你的 Git Bash,并运行 pacman -S python 在你现有的Git for Windows设置上安装软件包。

你需要对 Git for Windows 目录拥有写入权限。另外,你的 pacman 现在会认为它安装了很多软件包(来自SDK),但这并没有阻止我使用它。


这非常适合只需获取基本实用程序的情况。我可以确认这对于获取“expect”是可行的。 - joshhemphill
3
我遇到了2个错误:错误:无法初始化事务(无法锁定数据库) 错误:无法锁定数据库:权限被拒绝我尝试安装Python和rsync。 - Esteban
我不得不以管理员身份运行Git Bash才能使pacman -S正常工作。这并不理想... - serg06

21
"Git for Windows SDK"的大小为5.33GB,而"Git for Windows"则为691MB,"Portable Git"则为275MB。我使用轻巧便捷的Portable Git。起初,在后两种Git(msys2)中恢复和使用pacman似乎毫无希望,因为Google在/var/lib/pacman/local中排除了所有元数据文件。请阅读官方解释:{{官方解释链接}}。"

https://wiki.archlinux.org/index.php/Pacman#.22Failed_to_commit_transaction_.28conflicting_files.29.22_error

如果没有那些元数据文件,您就不知道Google选择用于构建这两种Git版本的msys2软件包的确切集合和版本。如果您强制安装或复制当前版本的msys2软件包,则存在与Google构建和测试的git二进制文件版本不匹配的风险。

好吧,直到我发现了这个文件:/etc/package-versions.txt,其中列出了匹配的msys2软件包和版本清单。现在在github上有一个明确的来源。以下是如何在便携式Git中还原pacman(可以将命令一次性复制并粘贴到git-bash shell中):

步骤1:运行这些命令下载/etc/pacman.conf和3个软件包:pacman、pacman-mirrors和msys2-keyring。请参见我下面的2022年12月9日的评论,了解为什么需要.zx格式的zstd。这些软件包/版本在32位和64位便携式Git 2.38.1上进行了测试:

if [[ "$HOSTTYPE" == "i686" ]]; then
 pacman="
pacman-6.0.0-4-i686.pkg.tar.zst
pacman-mirrors-20210703-1-any.pkg.tar.zst
msys2-keyring-1~20210213-2-any.pkg.tar.zst
"
 zstd=zstd-1.5.0-1-i686.pkg.tar.xz
else
 pacman="
pacman-6.0.1-18-x86_64.pkg.tar.zst
pacman-mirrors-20220205-1-any.pkg.tar.zst
msys2-keyring-1~20220623-1-any.pkg.tar.zst
"
 zstd=zstd-1.5.2-1-x86_64.pkg.tar.xz
fi
for f in $pacman; do curl https://repo.msys2.org/msys/$HOSTTYPE/$f -fo ~/Downloads/$f; done
curl -L https://github.com/mcgitty/pacman-for-git/raw/main/$zstd -o ~/Downloads/$zstd
curl https://raw.githubusercontent.com/msys2/MSYS2-packages/7858ee9c236402adf569ac7cff6beb1f883ab67c/pacman/pacman.conf -o /etc/pacman.conf

步骤2:在根目录下解压它们,然后使用以下命令恢复 pacman:

cd /
tar x --xz -vf ~/Downloads/$zstd usr
for f in $pacman; do tar x --zstd -vf ~/Downloads/$f usr etc 2>/dev/nul; done
mkdir -p /var/lib/pacman
pacman-key --init
pacman-key --populate msys2
pacman -Syu

步骤三:接下来的一组命令会恢复所有匹配的元数据(请耐心等待)。与步骤1中的zstd包类似,这取决于我的公共github repo pacman-for-git 来提供每个Portable Git版本的git-sdk提交ID,我将尽力更新:

t=`grep -E 'mingw-w64-[ix_0-9]+-git ' /etc/package-versions.txt`
t=`curl -sL https://github.com/mcgitty/pacman-for-git/raw/main/version-tags.txt|grep "$t"`
[[ "$t" == "" ]] && echo "ERROR: Commit ID not logged in github pacman-for-git." && read
b=64 && [[ "$t" == *-i686-* ]] && b=32
URL=https://github.com/git-for-windows/git-sdk-$b/raw/${t##* }
cat /etc/package-versions.txt | while read p v; do d=/var/lib/pacman/local/$p-$v;
 mkdir -p $d; echo $d; for f in desc files mtree; do curl -fsSL "$URL$d/$f" -o $d/$f;
 done; [[ ! -f $d/desc ]] && rmdir $d; done

第四步:现在,请求使用“make”和“zip”是否过分?
pacman -S make zip

这是一个只有337MB的小环境,可以扩展和升级!


2
等待第三步大约需要5分钟。 - Shimon Doodkin
1
总的来说,这对我有用,但还有两件事情需要额外处理:1)现在使用ZSTD压缩链接包,而7zip默认不支持。我安装了Modern7z编解码器,解压它们后只需使用tar而无需解压。2)我需要一个默认的/etc/pacman.conf文件才能使其正常工作,我在这里找到了它:https://raw.githubusercontent.com/msys2/MSYS2-packages/master/pacman/pacman.conf - Andre Steenveld
2
安德烈是正确的。Msys2在2020年12月转换为zstd软件包,这创建了一个先有鸡还是先有蛋的问题:当前版本的Portable Git不包括zsdt,这会阻止运行第2步中的tar命令。添加zsdt(蛋)需要pacman(鸡),而pacman需要zstd(蛋)...因此,我修改了第1步中的3个链接以下载.xz软件包。希望在msys2删除所有.xz软件包之前,Portable Git发布也将包括zstd。 - Michael Chen
1
这个方案很好,但在运行 pacman -Syu 之前,我必须使用 pacman-db-upgrade 升级数据库。然而,只有当我提供了 -r /../ 作为附加参数时,pacman-db-upgrade 才会运行,不确定原因。如果没有该参数,它会在根路径前面添加一个额外的斜杠,即 //…。最后,我还需要安装 pacman -S --overwrite "*" msys2-keyring - Robin Dinse
1
感谢@DelphyM,JosiahYoder。这个解决方案确实面临着一些新的挑战:a) 对于64位便携式Git来说,步骤1已不再可行,因为Msys2从其仓库中删除了大部分.xz软件包--请参见我上面的2021年7月8日的评论(对于那里的几个拼写错误表示抱歉)。这可以通过预构建的zstd二进制文件来解决。b) 步骤3不可靠,因为git-for-windows团队不断删除旧版本的软件包。例如,最新的2.38.1版本附带bash-5.1.016-1,但是git-sdk-[32|64]只有/var/lib/pacman/local/bash-5.2.012-1。我还没有找到解决办法。 - Michael Chen
显示剩余17条评论

13

似乎有一种记录在案的方式来实现此操作,而无需安装Git for Windows SDK(该软件包非常大)。当我在GitHub 问题#1912上询问所有这些信息时,PhilipOakley给了我这个信息的链接。

以下是Git for Windows GitHub wiki页面上关于此的当前文本:

##在MSYS2 proper内安装

###请注意,Git for Windows官方不支持此场景

(不支持此场景的原因是没有志愿者支持该场景。)

此指南假定您想要64位版本的Git for Windows。

由于Git for Windows基于MSYS2,因此可以将git软件包安装到现有的MSYS2安装中。这意味着,如果您已经在计算机上使用MSYS2,则可以使用Git for Windows而无需运行完整的安装程序或使用便携式版本。

请注意,采用这种方法可能存在一些注意事项。Git for Windows为msys2-runtime创建了一些补丁,但未向上游发送。 (这曾经是计划中的事情,但在问题#284中确定这可能不会发生。)这意味着您必须安装Git for Windows自定义版的msys2-runtime才能在MSYS2中完全使用git。 以下是需要执行的步骤:
  1. 打开一个MSYS2终端。
  2. 编辑/etc/pacman.conf,并在[mingw32]之前(我的机器上第71行)添加git-for-windows软件包存储库:

[git-for-windows] Server = https://wingit.blob.core.windows.net/x86-64

并且还可以选择添加针对相反体系结构(即64位SDK的MINGW32)的仅限MINGW的存储库:

[git-for-windows-mingw32] Server = https://wingit.blob.core.windows.net/i686

  1. 授权签名密钥(在https://github.com/msys2/msys2/issues/62问题修复之前,可能需要重复执行此步骤)

curl -L https://raw.githubusercontent.com/git-for-windows/build-extra/master/git-for-windows-keyring/git-for-windows.gpg | pacman-key --add - && pacman-key --lsign-key 1A9F3986

  1. 接着同步新的软件仓库

pacboy update

  1. 这将更新msys2-runtime,并因此要求您关闭终端窗口(不是仅退出pacman进程)。别担心,只需关闭所有当前打开的MSYS2 shells和MSYS2程序。双重检查任务管理器,如果窗口关闭后pacman.exe仍在运行,请将其杀死,因为它可能会残留。一旦所有内容都关闭了,请重新启动一个新的终端。

  2. 然后再次同步(更新软件包的非核心部分):

pacboy update

  1. 最后,安装Git / cURL软件包:

pacboy sync git:x git-doc-html:x git-doc-man:x git-extra: curl:x

  1. 最后,在MINGW64 shell中执行git --version命令,检查是否一切正常,应该输出类似于git version 2.14.1.windows.1的结果(或更新版本)。

@VonC在评论中指出,关于这种方法可能需要额外步骤的讨论在讨论区中部进行,位于https://github.com/git-for-windows/git/issues/2688

现在,也许有一种实现所需结果的新方法:


3
这个答案假设读者已经安装好了完整的MSYS2。然而,我假设原帖作者已经安装了Windows版Git。因此上述说明并不适用于原帖作者的设置。 - Daniel K.
据我所知,没有支持或记录的方法可以简单地将Pacman添加到GfW中。您可以设置一个新的、不同的GfW安装,其中包含Pacman;因此,您从拥有GfW到同时拥有GfW和Pacman...但是,是的,它肯定会替换您现有的GfW安装。 - MikeBeaton
@DanielK.:尽管这个答案在“反过来做”的情况下有哪些限制方面提供了相当多的信息(我给加一分)。 - Fizz
我发现当前版本的MSYS2实际上也提供了一个git(可通过pacman安装)https://packages.msys2.org/base/git。但它可能会受到一些(性能?)限制... 我猜测这可能与在刘伟华的回答中讨论的GVFS有关,但是不是很清楚... - Fizz
2
这个问题正在 https://github.com/git-for-windows/git/issues/2688 上讨论:第四步不完整。 - VonC

6

在Windows 10 x86_64 1909 10.0.18363.752和Windows 11 x86_64 21H2 10.0.22000.434上测试了msys2 20190524和msys2 20220128,使用常规的Git for Windows。

  1. 安装msys2(测试版本为20190524)或Git for Windows SDK(未经完全测试,但应该可以正常运行),两者都包含PacMan和Git。

使用VFS for Git for Windows或Scalar for Git for Windows(也称为Microsoft git)。 方法1(有一些限制)

  1. 安装VFSForGit(https://github.com/microsoft/VFSForGit)。
  2. 安装Microsoft git(https://github.com/microsoft/git),并启用此选项“从命令行和第三方软件中获取Git”。
  3. 在cmd.exe中执行以下命令,而不是在bash中,在msys64\usr\bin\ 目录下创建一个名为“git”的符号链接,指向C:\Program Files\Git\bin\git.exemklink git "C:\Program Files\Git\bin\git.exe"
  4. 克隆一个新的gvfs repo。gvfs clone https://dev.azure.com/somebody/_git/somerepo只有gvfs命令无法在msys2上执行。
  5. 像在msys2上一样使用git命令。

使用VFS for Git for Windows或Scalar for Git for Windows。 方法2

推荐使用Git的虚拟文件系统(以前是GVFS)。 官方网站为https://vfsforgit.org/,已测试版本为2.22和2.26。 Scalar(官方网站https://github.com/microsoft/scalar)不建议使用,也没有完全测试。

  1. 安装GVFS带有GVFS补丁的Git for Windows或者安装Scalar for Git带有Scalar补丁的Git for Windows,在同一台计算机上不要同时安装两者。默认安装目标文件夹为C:\Program Files\Git
  2. 在其他位置安装msys2 x64,不要安装在C:\Program Files\Git中。默认情况下,它位于C:\msys64
  3. 将msys2的文件和子文件夹(除了/etc和git二进制文件,出厂时msys2没有git)复制到Git for Windows VFS版本中,并将/etc/pacman.d/etc/pacman.conf复制到msys64文件夹中的Git安装文件夹中,覆盖现有文件。这将更新msys2和MinGW运行时至最新版本。对于PacMan,必要的文件为/usr/bin/pac*;/etc/pacman.conf;/etc/pacman.d/;/var;/usr/bin/msys*。(未完全测试)。
  4. 设置终端应用程序。运行C:\Program Files\Git\bin\bash.exe将启动Git for Windows的bash。运行C:\Program Files\Git\usr\bin\bash.exe将启动msys2的bash。配置终端程序的bash路径,例如Hyper Terminal。由于Git在系统文件夹中,终端程序应以管理员身份运行
  5. 为GVFS配置$PATH环境变量。在Git Bash中运行此命令。export PATH=$PATH:/C/Program\ Files/GVFSexport PATH=$PATH:"/C/Program Files/GVFS"。或者在控制面板的系统属性中设置GVFS的环境变量。重新登录以生效。有时此配置不起作用,但PacMan仍然可以运行。
  6. 修复PacMan。为二进制文件设置可执行权限。例如。chmod +x /usr/bin/pacman;pacman-key --init;pacman-key --populate msys2;pacman-key --refresh-keys;pacman --sync pacman --refresh --sysupgrade --sysupgrade --overwrite "*" 。使用选项--overwrite \*,因为一些软件包是由Git for Windows而不是PacMan安装的。

如果能解释一下“Windows版Git的VFS”和“Windows版Git的Scalar”是什么,那么这个回答会更有帮助。 - Fizz
@vonC 我有点困惑——你是在支持 Git 的 VFS 吗?WeiHua 对 MSYS2 或 Git For Windows SDK 似乎没有多少评论。 - Josiah Yoder
@JosiahYoder 我是在承认除了Git for Windows SDK/mysgit之外,可以使用另一种替代方案(通过VFS)来使用pacman。当我最初写下我的答案时,VFS并不存在。 - VonC

1

现在,Pacman使用Zstd进行压缩。因此,更新了@michael-chen的场景(我使用WSL的unzstd)。

for f in pacman-6.0.1-25-x86_64.pkg.tar.zst pacman-mirrors-20221016-1-any.pkg.tar.zst msys2-keyring-1~20221024-1-any.pkg.tar.zst;   do curl https://repo.msys2.org/msys/x86_64/$f -o ~/Downloads/$f; done
cd /
tar --use-compress-program=unzstd -xvf ~/Downloads/msys2-keyring-1~20221024-1-any.pkg.tar.zst usr
tar --use-compress-program=unzstd -xvf ~/Downloads/pacman-mirrors-20221016-1-any.pkg.tar.zst etc
tar --use-compress-program=unzstd -xvf ~/Downloads/pacman-6.0.1-25-x86_64.pkg.tar.zst usr
mkdir -p /var/lib/pacman
pacman-key --init
pacman-key --populate msys2
pacman -Sy
export URL=https://github.com/git-for-windows/git-sdk-64/raw/main
cat /etc/package-versions.txt | while read p v; do d=/var/lib/pacman/local/$p-$v; mkdir -p $d; echo $d; for f in desc files install mtree; do curl -sSL "$URL$d/$f" -o $d/$f; done; done

我的解决方案的前提是使用“Portable Git”,它没有使用zstd或unzstd程序进行构建。因此,您的三个tar命令将无法工作。 - Michael Chen

0

从msys2复制pacman对我很有用,最后大多数人都忘记了可以使用pacman进行自我更新,如pacman -Syy msys/pacman

  1. 在msys中运行pacman -Ql pacman

  2. 复制匹配的文件列表

  • /etc/*.conf
  • /usr/bin
  • /usr/include
  • /usr/lib
  • /var/lib
3. 并且也要复制数据库。
  • /etc/pacman
4. 此时我已经有一个工作的 pacman,我使用 pacman -Ss pacman 进行检查,但是缺少文件,所以我运行自我刷新 pacman -Syy msys/pacman

这个时候,为什么不直接使用MSYS2呢? - HolyBlackCat
除了git-bash有特定于操作系统的改进和MSYS2需要手动配置菜单项外,这是个人偏好。这个答案回答了OP的问题,就像我一样拥有一个工作的git-bash。对于MSYS中的git,你可以使用mklink符号链接你现有的.gitconfig文件。 - ltapia

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