我正在阅读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软件包?
我正在阅读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软件包?
您在最新的Git for Windows(2.5.3)中看到的bash是一个比旧版msysgit更为先进的bash,仅用于执行git命令。这是有意的。我们没有在Git for Windows中附带pacman。
如果您想要一个完整的包管理器维护的环境,可以尝试使用Git for Windows SDK。
不要使用目录链接将现有的git for windows与msys2主系统连接起来。
如果您卸载它,它会认为链接的目录属于它,并删除您的整个主目录,包括“下载”等子目录。
小心处理msys2。我不知道对于git for windows SDK是否也是如此,但尝试将pacman从其他系统集成到git for windows时请注意。
setup-git-sdk.bat
以限制安装的软件包(排除Python和Mingw构建工具)。这样可以减小安装文件的大小,但仍然允许您使用pacman升级现有软件包并安装其他软件包。但是,您需要从Git for Windows安装中复制git-bash.exe
和git-cmd.exe
(还有其他文件?)。 - Brecht MachielsGit 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/git的https://github.com/git-for-windows/git/releases/链接)拉取最新版本。
我不想更改我已经安装好的Git for Windows,所以我进行了一些 improvisation:
${git-sdk}/usr/bin/pacman.exe
复制到 ${git}/usr/bin
${git-sdk}/etc/pacman.conf
和 ${git-sdk}/etc/pacman.d
复制到 ${git}/etc
${git-sdk}/var
复制到 ${git}/
现在你可以打开你的 Git Bash,并运行 pacman -S python
在你现有的Git for Windows设置上安装软件包。
你需要对 Git for Windows 目录拥有写入权限。另外,你的 pacman
现在会认为它安装了很多软件包(来自SDK),但这并没有阻止我使用它。
pacman -S
正常工作。这并不理想... - serg06如果没有那些元数据文件,您就不知道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
pacman -S make zip
这是一个只有337MB的小环境,可以扩展和升级!
tar
而无需解压。2)我需要一个默认的/etc/pacman.conf
文件才能使其正常工作,我在这里找到了它:https://raw.githubusercontent.com/msys2/MSYS2-packages/master/pacman/pacman.conf - Andre Steenveldpacman -Syu
之前,我必须使用 pacman-db-upgrade
升级数据库。然而,只有当我提供了 -r /../
作为附加参数时,pacman-db-upgrade
才会运行,不确定原因。如果没有该参数,它会在根路径前面添加一个额外的斜杠,即 //…
。最后,我还需要安装 pacman -S --overwrite "*" msys2-keyring
。 - Robin Dinse似乎有一种记录在案的方式来实现此操作,而无需安装Git for Windows SDK(该软件包非常大)。当我在GitHub 问题#1912上询问所有这些信息时,PhilipOakley给了我这个信息的链接。
以下是Git for Windows GitHub wiki页面上关于此的当前文本:
请注意,采用这种方法可能存在一些注意事项。Git for Windows为##在MSYS2 proper内安装
###请注意,Git for Windows官方不支持此场景
(不支持此场景的原因是没有志愿者支持该场景。)
此指南假定您想要64位版本的Git for Windows。
由于Git for Windows基于MSYS2,因此可以将
git
软件包安装到现有的MSYS2安装中。这意味着,如果您已经在计算机上使用MSYS2,则可以使用Git for Windows而无需运行完整的安装程序或使用便携式版本。
msys2-runtime
创建了一些补丁,但未向上游发送。 (这曾经是计划中的事情,但在问题#284中确定这可能不会发生。)这意味着您必须安装Git for Windows自定义版的msys2-runtime
才能在MSYS2中完全使用git。
以下是需要执行的步骤:
/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
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
pacboy update
这将更新msys2-runtime
,并因此要求您关闭终端窗口(不是仅退出pacman进程)。别担心,只需关闭所有当前打开的MSYS2 shells和MSYS2程序。双重检查任务管理器,如果窗口关闭后pacman.exe仍在运行,请将其杀死,因为它可能会残留。一旦所有内容都关闭了,请重新启动一个新的终端。
然后再次同步(更新软件包的非核心部分):
pacboy update
pacboy sync git:x git-doc-html:x git-doc-man:x git-extra: curl:x
git --version
命令,检查是否一切正常,应该输出类似于git version 2.14.1.windows.1
的结果(或更新版本)。@VonC在评论中指出,关于这种方法可能需要额外步骤的讨论在讨论区中部进行,位于https://github.com/git-for-windows/git/issues/2688。
现在,也许有一种实现所需结果的新方法:
git
(可通过pacman安装)https://packages.msys2.org/base/git。但它可能会受到一些(性能?)限制... 我猜测这可能与在刘伟华的回答中讨论的GVFS有关,但是不是很清楚... - Fizzmsys64\usr\bin\
目录下创建一个名为“git”的符号链接,指向C:\Program Files\Git\bin\git.exe
。 mklink git "C:\Program Files\Git\bin\git.exe"
gvfs clone https://dev.azure.com/somebody/_git/somerepo
。只有gvfs命令无法在msys2上执行。推荐使用Git的虚拟文件系统(以前是GVFS)。 官方网站为https://vfsforgit.org/,已测试版本为2.22和2.26。 Scalar(官方网站https://github.com/microsoft/scalar)不建议使用,也没有完全测试。
GVFS
和带有GVFS补丁的Git for Windows
或者安装Scalar for Git
和带有Scalar补丁的Git for Windows
,在同一台计算机上不要同时安装两者。默认安装目标文件夹为C:\Program Files\Git
。C:\Program Files\Git
中。默认情况下,它位于C:\msys64
。/etc/pacman.d
和/etc/pacman.conf
复制到msys64文件夹中的Git安装文件夹中,覆盖现有文件。这将更新msys2和MinGW运行时至最新版本。对于PacMan,必要的文件为/usr/bin/pac*;/etc/pacman.conf;/etc/pacman.d/;/var;/usr/bin/msys*
。(未完全测试)。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在系统文件夹中,终端程序应以管理员身份运行。export PATH=$PATH:/C/Program\ Files/GVFS
或export PATH=$PATH:"/C/Program Files/GVFS"
。或者在控制面板的系统属性中设置GVFS的环境变量。重新登录以生效。有时此配置不起作用,但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安装的。现在,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
从msys2复制pacman对我很有用,最后大多数人都忘记了可以使用pacman进行自我更新,如pacman -Syy msys/pacman
在msys中运行pacman -Ql pacman
复制匹配的文件列表
pacman -Ss pacman
进行检查,但是缺少文件,所以我运行自我刷新 pacman -Syy msys/pacman
。