Git 中 Windows 的包管理(Git Bash)?

Package management in Git for Windows (Git Bash)?

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

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

$ pacman
bash: pacman: command not found

有谁知道发生了什么事吗?

这个 wiki 指的是哪个 git 版本?

有没有办法在 Git 内为 windows 安装额外的包到 msys2?

issue 397所述:

This is intended. We do not ship pacman with Git for Windows.
If you are interested in a fully fledged package manager maintained environment you have to give the Git for Windows SDK a try.

您在 latest git for Windows (2.5.3), which is a more recent bash than the old msysgit one 中看到的 bash 仅用于执行 git 命令。
它不是安装任何第三方软件包的完整 linux 环境。


警告dhj reports in

Do not link your existing git for windows with the msys2 main system by using a directory junction.
If you uninstall it will decide that linked directory belongs to it and DELETE YOUR ENTIRE HOME DIRECTORY including sub-directories like "Downloads".
Beware dealing with msys2.

I don't know if the same is true for the git for windows SDK, but BE CAREFUL trying to get pacman from other systems integrated with git for windows.

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

tree 可通过 pacman(包管理器)获得,但仅当您安装“Git for Windows SDK[时才可用=64=]"(滚动到 https://gitforwindows.org/ which provides a link to download installer for it from https://github.com/git-for-windows/build-extra/releases/latest 的底部)

很有帮助。他们提到 git-for-windows 并不意味着在默认安装中包含 pacman

所以我为 Windows SDK 安装了“Git”,然后在它的 bash 提示符 (SDK-64) 中我 运行 按照以下安装当前树 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.exe 到它的 /usr/bin 目录,例如

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

现在我可以 运行 tree v1.7.0 来自 Git Bash shells.

为了让其他人和我自己在未来的机器上更容易,我查看了 pacman 从哪里获取 tree 包,方法是 运行 在我的以下内容中Git 用于 Windows SDK Bash 终端:

$ 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(仅供参考:即使它说的是 msys,它实际上是在使用 msys2),所以我查看了 /etc/pacman.d/mirrorlist.msys 第一个镜像指向 http://repo.msys2.org/msys/$arch/

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

例如直接下载 link for tree v1.7.0-1

仅供参考:Git SCM Window 的下载地址为 https://git-scm.com/download/ pulls the latest from Git for Windows GitHub (https://github.com/git-for-windows/git from the https://github.com/git-for-windows/git/releases/ link)

好像有个documented way to do this without having to install the Git for Windows SDK (which is very large). I was given the link to this info by PhilipOakley when I asked about all this on GitHub issue #1912.

这是 Git 的 Windows GitHub wiki page 的当前文本:

##Install inside MSYS2 proper

###Please note that this scenario is not officially supported by Git for Windows

(The reason this is unsupported is that there are no volunteers to support that scenario.)

This guide assumes that you want the 64-bit version of Git for Windows.

Git for Windows being based on MSYS2, it's possible to install the git package into an existing MSYS2 installation. That means that if you are already using MSYS2 on your computer, you can use Git for Windows without running the full installer or using the portable version.

Note however that there are some caveats for going this way. Git for Windows created some patches for msys2-runtime that have not been sent upstream. (This had been planned, but it was determined in issue #284 that it would probably not be happening.) This means that you have to install Git for Windows customized msys2-runtime to have a fully working git inside MSYS2.

Here the steps to take:

  1. Open an MSYS2 terminal.

  2. Edit /etc/pacman.conf and just before [mingw32] (line #71 on my machine), add the git-for-windows packages repository:

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

and optionally also the MINGW-only repository for the opposite architecture (i.e. MINGW32 for 64-bit SDK):

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

  1. Authorize signing key (this step may have to be repeated occasionally until https://github.com/msys2/msys2/issues/62 is fixed)

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. Then synchronize new repository

pacboy update

  1. This updates msys2-runtime and therefore will ask you to close the window (not just exit the pacman process). Don't panic, simply close all currently open MSYS2 shells and MSYS2 programs. Double-check Task Manager and kill pacman.exe it's still running after the window is closed, because it can linger. Once all are closed, start a new terminal again.

  2. Then synchronize again (updating the non-core part of the packages):

pacboy update

  1. And finally install the Git/cURL packages:

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

  1. Finally, check that everything went well by doing git --version in a MINGW64 shell and it should output something like git version 2.14.1.windows.1 (or newer).

@VonC 在评论中指出,在 https://github.com/git-for-windows/git/issues/2688.

的讨论进行到一半时,有人讨论了这种方法可能需要的额外步骤

现在,可能还有一种实现所需结果的新方法:

我不想从我已经在工作的 Git 移动到 Windows 安装所以我即兴创作了一点:

  1. 在其他地方为 Windows SDK 安装 Git。为此,您需要超过 3 GB 的免费空间 space。
  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 上安装软件包以进行 Windows 设置。

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

在 Windows 10 x86_64 1909 10.0.18363.752 上的 msys2 20190524 和 Windows 11 x86_64 21H2 10.0.22000.434

上的 msys2 20220128 上测试

对 Windows 使用常规 Git。

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

为 Git 使用 VFS 为 Windows 或为 Git 为 Windows 使用标量(又名 Microsoft git)。方法 #1(有一些限制)

  1. 安装 VFSForGit(https://github.com/microsoft/VFSForGit)。
  2. 安装 Microsoft git ( https://github.com/microsoft/git ) 并启用此选项“Git 从命令行和第 3 方软件”。
  3. 在指向 C:\Program Files\Git\bin\git.exemsys64\usr\bin\ 中创建一个名为“git”的符号 link。在 cmd.exe 中执行以下命令,而不是在 bash 中执行。 mklink git "C:\Program Files\Git\bin\git.exe"
  4. 克隆一个新的 gvfs 存储库。 gvfs clone https://dev.azure.com/somebody/_git/somerepo只有gvfs命令不能在msys2上执行
  5. 正常使用msys2时使用git命令。

为 Git 使用 VFS 为 Windows 或为 Git 使用标量为 Windows。方法#2

Git 的虚拟文件系统(以前是 GVFS。官方网站 https://vfsforgit.org/ ) is recommended. Version 2.22 & 2.26 are tested. Scalar (Official website https://github.com/microsoft/scalar 推荐,也没有完全测试。

  1. 安装 GVFSGit for Windows with GVFS patch。或者安装 Scalar for GitGit for Windows with Scalar patchNOT BOTH 在同一台机器上。默认安装目标是 C:\Program Files\Git.
  2. C:\Program Files\Git 以外的地方安装 msys2 x64。默认情况下,它位于 C:\msys64.
  3. 将 msys2 的文件和子文件夹(/etc 和 git 二进制文件除外。msys2 出厂时没有 git。)复制到 Git 用于 Windows VFS 版本,将msys64文件夹中的/etc/pacman.d/etc/pacman.conf复制到Git安装文件夹,覆盖已有文件。它会将 msys2 和 MinGW 运行time 更新到最新版本。对于 PacMan,必需的文件是 /usr/bin/pac* ; /etc/pacman.conf ; /etc/pacman.d/ ; /var ; /usr/bin/msys* ; 。(未完全测试。)
  4. 设置终端应用程序。 运行 C:\Program Files\Git\bin\bash.exe 将为 Windows 启动 Git 的 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 安装的 Windows 而不是 PacMan。

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

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

好吧,直到我发现这个文件:/etc/package-versions.txt,匹配的 msys2 包和版本的清单。现在 github 中有明确的来源。这是我在便携式 Git:

中恢复 pacman 的方法

第 1 步:运行 这些命令用于下载 /etc/pacman.conf 和 3 个软件包:pacman, pacman-mirrors and msys2-keyring。这些是 msys2 切换到 zstd 之前的 .xz 包。请参阅下面我的评论。

curl https://raw.githubusercontent.com/msys2/MSYS2-packages/7858ee9c236402adf569ac7cff6beb1f883ab67c/pacman/pacman.conf -o /etc/pacman.conf
for f in pacman-5.2.2-4-x86_64 pacman-mirrors-20201028-1-any msys2-keyring-1~20201002-1-any; 
 do curl https://repo.msys2.org/msys/x86_64/$f.pkg.tar.xz -o ~/Downloads/$f.pkg.tar.xz;
done

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

cd /
tar x --xz -vf ~/Downloads/msys2-keyring-1~20201002-1-any.pkg.tar.xz usr
tar x --xz -vf ~/Downloads/pacman-mirrors-20201028-1-any.pkg.tar.xz etc
tar x --xz -vf ~/Downloads/pacman-5.2.2-4-x86_64.pkg.tar.xz usr
mkdir -p /var/lib/pacman
pacman-key --init
pacman-key --populate msys2
pacman -Syu

第 3 步:接下来的两个命令恢复所有匹配的元数据。第二个命令是多行的,但仍然可以安全地剪切和粘贴(耐心等待):

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

第 4 步:现在,要求 'make' 和 'zip' 是不是太过分了?

pacman -S make zip

瞧瞧,仍然只有 337MB,意味着可以扩展和升级的小环境!