Вернуть Git commit id в Powershell

Я использую приведенный ниже код, чтобы git зафиксировать изменение и вернуть commitid

function gitcommit()
{

   git commit -a -m "message"
   $commitid= git rev-parse HEAD
   git push -q
  $comid=$commitid
   return $comid
}

function main()
{

  $commitid= gitcommit() 
  Write-Host "Commit id is $commitid"


}

В функции gitcommit я должен получить правильный идентификатор фиксации как 7de234567f68fa8a3b40a95abc4d6d82a75d93 . Но проблема, с которой я сталкиваюсь, заключается в том, что, возвращая идентификатор коммита в виде строки, он приходит как система типов . Массив с содержанием ниже

 On branch master, Your branch is up to date with 'origin/master'., , nothing to commit, working tree clean, On branch master, Your branch is up to date with 'origin/master'., , nothing to commit, working tree clean,7de234567f68fa8a3b40a95abc4d6d82a75d93

Всего 1 ответ


Здесь происходит несколько вещей:

  1. Ваша функция возвращает массив объектов, потому что вы не подавляете вывод некоторых из ваших команд. Все, что записано в выходной поток, передается и возвращается по конвейеру .
  2. Ключевое слово return не обязательно. В PowerShell функции return больше похожи Write-Output $variable; break Write-Output $variable; break - записывает переменную в выходной поток и затем возвращается в родительскую область. Это не требуется, если вы не хотите остановить выполнение функции до запуска остальной части кода.
  3. Чтобы ваша команда git commit насыщала конвейер, перенаправьте вывод команды на Out-Null , Write-Host или один из других потоков. Я написал здесь ответ, который очень подробно описывает перенаправление и выходные потоки. В качестве альтернативы, вы можете использовать ключ -q с git push и git commit для подавления их вывода, но я бы порекомендовал вместо этого направлять вывод в поток Verbose или поток Information если вы все еще хотите видеть эту информацию, но не действовать на нее программно.
  4. Здесь это не вызывает проблем, но не вызывайте функции PowerShell с круглыми скобками () . Да, используйте круглые скобки со статическими методами или методами экземпляра, но использование их с функциями в конечном итоге будет оцениваться как подвыражение, которое эффективно объединит несколько аргументов в один.
  5. Добавление [CmdletBinding()] в определение вашей функции позволяет вам вызывать автоматические параметры в вашем командлете. Например, gitcommit -Verbose включит подробный поток для этого выполнения gitcommit , и вы сможете увидеть в противном случае подробный вывод.
  6. Рассмотрите возможность проверки $LASTEXITCODE -eq 0 после каждой команды git - команда не гарантированно $LASTEXITCODE -eq 0 успешно, и в этом случае вы можете вывести что-то другое.

Принимая во внимание вышеуказанные моменты, ваш код может быть улучшен следующим образом:

function gitcommit
{
   [CmdletBinding()] 
   git commit -a -m "message" | Write-Verbose
   if( $LASTEXITCODE -ne 0 ){
     Write-Warning "``git commit`` failed with exit code ${LASTEXITCODE}"
     return # Return now because the commit failed
   }

   git rev-parse HEAD # This does not need to be returned because it outputs to the output stream
   git push | Write-Verbose
   if( $LASTEXITCODE -ne 0 ){
     Write-Warning "``git push`` failed with exit code ${LASTEXITCODE}"
   }
}

function main()
{

  $commitid= gitcommit
  Write-Host "Commit id is $commitid"
}

Есть идеи?

10000