Как использовать команду git bash в приложении C#
Привет
Я реализовал небольшое приложение, которое будет вызывать Git-bash.exe и выполните команду, чтобы получить список файлов, связанных с идентификатором фиксации. Я уверен, что весь код верен, за исключением того, как я передаю Аргументы процессу. Может ли кто-нибудь, пожалуйста, дать мне знать, как передать аргумент Git bash процессу C#. Я много гуглил и не нашел правильного способа привести этот аргумент.
Я знаю, что проблема находится в нижней строке
gitInfo.Arguments = "-c \"" + "git diff-tree -r 61140bb40f879dd21e8624fe8e2125df846572e8" + "\"";
Может ли кто-нибудь дать мне знать, как правильно передать аргументы?
Что я уже пробовал:
ProcessStartInfo gitInfo = new ProcessStartInfo(); gitInfo.CreateNoWindow = false; gitInfo.UseShellExecute = false; gitInfo.RedirectStandardError = true; gitInfo.RedirectStandardOutput = true; gitInfo.FileName = @"C:\Program Files\Git\git-bash.exe"; Process gitProcess = new Process(); gitInfo.WorkingDirectory = @"D:\CodeBranch"; gitInfo.Arguments = "-c \"" + "git diff-tree -r 61140bb40f879dd21e8624fe8e2125df846572e8" + "\""; gitProcess.StartInfo = gitInfo; gitProcess.Start(); string stderr_str = gitProcess.StandardError.ReadToEnd(); // pick up STDERR string stdout_str = gitProcess.StandardOutput.ReadToEnd(); // pick up STDOUT gitProcess.WaitForExit(); gitProcess.Close();
Richard MacCutchan
Это выглядит правильно. В чем же проблема?
OriginalGriff
Что он делает, чего вы не ожидали, или не делает, что вы сделали?
Есть ли какие-либо сообщения об ошибках?
Что вы пытались выяснить, что именно происходит?
Sampath579
Окно git-bash всплывает и немедленно исчезает. Та же команда git diff-tree-r 61140bb40f879dd21e8624fe8e2125df846572e8 если я ввожу вручную в консоль git-bash, то я получаю список файлов правильно, но когда отправляю его как arugment в процессе c#, он не может выполнить эту команду. Если я комментирую эту часть аргументов и выполняю свой код, то консоль git-bash всплывает и остается на более длительное время, и поэтому я чувствую, что способ передачи аргументов процессу неправильный.
OriginalGriff
Итак, что же говорит отладчик в потоках strerr и strout?
Что он показывает - именно то, что находится в строке свойства arguments? (Я предполагаю, что это не фиксированное значение идентификатора, судя по тому, как вы разнесли строку с одним аргументом).
Sampath579
strerr_str пуст, так как консоль git-bash не содержит никаких данных, и окно больше не существует во время его чтения. Этот идентификатор-это идентификатор фиксации, который я предоставил и который является действительным в моем проекте.
Когда я проверяю значение аргументов в visual studio во время отладки значение аргументов выглядит следующим образом:
-c "git diff-tree -r 61140bb40f879dd21e8624fe8e2125df846572e8"
Richard MacCutchan
Вы пробовали его без опции-c?
Sampath579
Я попробовал сделать следующее:
gitInfo.Аргументы = "git diff-tree -r 61140bb40f879dd21e8624fe8e2125df846572e8";
и вот результат
bash: /mingw64/bin/git: не удается выполнить двоичный файл
/usr/bin/bash: выход 126.
в консоли git bash.
Richard MacCutchan
Это говорит о том, что путь к git неверен или сам файл поврежден.
Sampath579
Нет. Я так не думаю, если это так, то как консоль git bash может правильно вызывать без аргументов?
Richard MacCutchan
Извините, понятия не имею. Но я не думаю, что это проблема с вашим кодом. Гораздо более вероятно, что это будет среда, в которой вы пытаетесь работать. Она работает на чистой Windows или ВСЛ?
Richard MacCutchan
У меня нет опыта работы с git-bash, но документация по адресу Git для Windows[^] предполагает, что исполняемый файл-это git, а не bash. Так что, возможно, вам нужно удалить "-c git" из ваших аргументов и просто передать фактическую команду git, начинающуюся с "diff-tree".
Sampath579
Даже попробовал это сделать, но безрезультатно. Везде, где в google люди просто говорят, чтобы написать команду там, но никто не дал пример, как написать команду в качестве образца.. :(
Richard MacCutchan
Я предлагаю вам перейти на сайт Git for Windows (ссылка находится в моем предыдущем сообщении) и обсудить это с другими пользователями. Это довольно специализированная часть программного обеспечения, и проблема не является программированием в обычном смысле.
Sampath579
Я мог бы решить эту проблему по-другому. Поскольку я не знаю, как передать этот аргумент командной строки в процессе c#, я написал пакетный файл со всеми этими командами GIT и вызвал этот пакетный файл из кода c#, и он работал как заклинание..