Звучит так, как будто вы хотите запустить Git для Windows вне MSYS2 и не хотите помещать весь каталог MSYS2 /usr/bin
в свой PATH.Также, вероятно, будет хорошей идеей избегать добавления /mingw64/bin
в вашу переменную PATH.
Я предлагаю создать программу-обертку для самого git.Он будет знать, где находится git.exe, и знать, какие каталоги помещать в PATH перед запуском git.exe.Он просто изменил бы PATH и затем передал бы все свои аргументы правильному git.exe.Поскольку вы, вероятно, используете оболочку, такую как командная строка Windows, которая не распознает сценарии оболочки Bash, вам, вероятно, нужно просто создать статически связанный исполняемый файл Windows, который использует Win32 API для этого.Затем поместите его в свой собственный каталог и добавьте этот каталог в PATH.
Вот код, который должен работать для вас.Однако вам придется отредактировать MSYS2_DIR
, чтобы он указывал на каталог, в котором вы установили MSYS2, и вам также придется редактировать строку target
.(У большинства пользователей MSYS2 git установлен с pacman, и он находится в /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;
}
Вы можете скомпилировать это, используя 32-бит или 64-битные наборы инструментов MinGW, которые предоставляет MSYS2.Просто запустите gcc wrapper.c -o git
.Это должно создать собственный исполняемый файл Windows без каких-либо зависимостей ни от каких библиотек MSYS2.