Я получаю сообщение об ошибке при выполнении удаленного сценария PowerShell. На моем локальном компьютере я запускаю сценарий PowerShell, который использует Invoke-Command
к cd
в каталог на удаленном экземпляре Amazon Windows Server, а затем Invoke-Command
для выполнения сценария, который находится на этом экземпляре сервера. Скрипт на сервере пытается git клонировать репозиторий из GitHub. Я могу успешно выполнять такие операции в серверном скрипте, как «ls» или даже «git --version». тем не мение git clone
, git pull
и т. д. приводят к следующей ошибке:
Клонирование в MyRepo ... + CategoryInfo: NotSpecified: (Клонирование в MyRepo ...: String) [], RemoteException + FullyQualifiedErrorId: NativeCommandError
Я впервые использую PowerShell или Windows Server. Может ли кто-нибудь дать направление по этой проблеме.
Клиентский скрипт:
$s = new-pssession -computername $server -credential $user
invoke-command -session $s -scriptblock { cd C:\Repos; ls }
invoke-command -session $s -scriptblock { param ($repo, $branch) & '.\clone.ps1' -repository $repo -branch $branch} -ArgumentList $repository, $branch
exit-pssession
Серверный скрипт:
param([string]$repository = "repository", [string]$branch = "branch")
git --version
start-process -FilePath git -ArgumentList ("clone", "-b $branch https://github.com/MyGithub/$repository.git") -Wait
Я изменил сценарий сервера, чтобы использовать процесс запуска, и он больше не генерирует исключение. Он создает новый каталог репозитория и каталог .git, но не записывает ни один из файлов из репозитория github. Это пахнет проблемой с разрешениями. Еще раз вызов сценария вручную (удаленный рабочий стол в поле Amazon и выполнение его из PowerShell) работает как шарм.
Что касается Powershell, это правильное поведение.
К сожалению (по крайней мере, на мой взгляд), git выводит много информации в stderr
даже если ошибок нет. Например git checkout -b somenewbranch
будет выводить такие вещи, как измененные списки файлов на стандартный вывод, но Switched to new branch somenewbranch
сообщение (которое я считаю наиболее актуальным) на stderr
.
Один из наиболее распространенных способов справиться с этим - перенаправить stderr
вывод на stdout
, например:
git rebase master 2>&1
Этого достаточно для большинства случаев, которые я видел. Если вы хотите что-то сделать с самим текстовым выводом, вам нужно пойти немного дальше, поскольку Powershell сохранит строки, исходящие из stderr, как RemoteException
вместо string
. Краткий пример того, как вы можете справиться с тем, что нужно записывать в журнал на консоль:
$result = Invoke-Expression "& git checkout -b somefeaturebranch 2>&1"
$output = ""
foreach($line in $result)
{
$val = ""
if($line.GetType().Name -eq "ErrorRecord")
{
$val = $line.Exception.Message
}else{
$val = $line
}
$output = "$output`r`n$val"
}
Write-Host $output
Я также вижу эту «ошибку» при локальном использовании Powershell ISE и Git. На самом деле это не ошибка; скорее Powershell ISE неправильно интерпретирует вывод консоли Git. Если вы попробуете консоль Powershell, вы должны заметить, что информация об ошибке не отображается. Похоже, что это просто особенность Powershell ISE (и, возможно, других хостов Powershell, которые плохо обрабатывают вывод консольных приложений).
Возможно, вы столкнулись с проблемой Double Hop, описанной здесь: http://blogs.msdn.com/b/clustering/archive/2009/06/25/9803001.aspx