听起来你想在 MSYS2 之外为 Windows 运行 Git,并且你想避免将所有 MSYS2 的/usr/bin
目录放在你的 PATH 上。避免/mingw64/bin
使用 PATH 也可能是一个好主意。
我建议为 git 本身制作一个包装程序。它会知道 git.exe 的位置,并知道在运行 git.exe 之前将哪些目录放在 PATH 上。它会简单地修改 PATH,然后将其所有参数传递给正确的 git.exe。由于您可能正在使用无法识别 Bash shell 脚本的 Windows 命令提示符之类的 shell,因此您可能只需要制作一个使用 Win32 API 的静态链接的本机 Windows 可执行文件来执行此操作。然后将它放在它自己的目录中,并将该目录添加到您的 PATH 中。
这是一些适合您的代码。但是,您必须进行编辑MSYS2_DIR
以指向安装 MSYS2 的目录,并且您也必须编辑该target
字符串。(大多数 MSYS2 用户都使用 pacman 安装了 git,它存在于/usr/bin
.
#include <windows.h>
#include <stdio.h>
#define MSYS2_DIR "C:/msys64"
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
const char * target = MSYS2_DIR "/usr/bin/git.exe";
BOOL success = SetEnvironmentVariable(
"PATH", MSYS2_DIR "/mingw64/bin;" MSYS2_DIR "/usr/bin/");
if (!success)
{
DWORD error = GetLastError();
fprintf(stderr, "Failed to set PATH: error %ld.\n", error);
return 1;
}
PROCESS_INFORMATION info;
STARTUPINFOA startup_info = {
sizeof(startup_info),
.hStdInput = GetStdHandle(STD_INPUT_HANDLE),
.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE),
.hStdError = GetStdHandle(STD_ERROR_HANDLE),
};
success = CreateProcessA(target, GetCommandLine(),
NULL, NULL, 1, 0, NULL, NULL, &startup_info, &info);
if (!success)
{
DWORD error = GetLastError();
fprintf(stderr, "Failed to start git: error %ld.\n", error);
return 1;
}
DWORD result = WaitForSingleObject(info.hProcess, INFINITE);
if (result)
{
fprintf(stderr, "Unexpected wait result: 0x%lx\n", result);
return 1;
}
DWORD code;
success = GetExitCodeProcess(info.hProcess, &code);
if (!success)
{
fprintf(stderr, "Failed to get child exit code.\n");
return 1;
}
return code;
}
您可以使用 MSYS2 提供的 32 位或 64 位 MinGW 工具链来编译它。跑吧gcc wrapper.c -o git
。这应该创建一个不依赖于任何 MSYS2 DLL 的本机 Windows 可执行文件。