Как получить "git log" в терминале или с помощью сценария оболочки, когда он не находится в репозитории

У меня есть агент сборки Teamcity, где мне нужно извлечь git log из репозитория. Проблема в том, что при запуске моего сценария оболочки его нет в репозитории git, поэтому git log не работает из коробки.

Кто-нибудь знает, как этого добиться.

У меня есть поиск по документации, но я не могу найти способ сделать это.

На данный момент решены проблемы

  1. Когда Teamcity «клонирует» проект из Github в агент, он фактически не клонирует его целиком. Итак, working directory не репозиторий.

  2. У меня нет SSH-доступа к github при запуске моего сценария оболочки, который мне нужен

Заранее спасибо.

Решение

См. Принятый ответ ниже.


person Community    schedule 04.11.2016    source источник
comment
Возможный дубликат git pull, когда он не находится в каталоге git   -  person pathfinderelite    schedule 04.11.2016
comment
Отвечает ли это на ваш вопрос? Использование команд git на этапе сборки TeamCity   -  person Leponzo    schedule 08.05.2021


Ответы (3)


Используйте флаг -C команды git. Это позволяет вам указать каталог git.

git -C 'git-working-dir' log
person pathfinderelite    schedule 04.11.2016
comment
Но это сработало бы, только если бы у меня был каталог git в агенте сборки, верно? - и я хочу получить его с github.com - person ; 04.11.2016
comment
@CodeMonkey Правильно, это работает только для локальных каталогов AFAIK. Вы можете клонировать каталог из GitHub, используя протокол git://; доступ по SSH потребуется только в том случае, если вы хотите отправлять обновления. - person pathfinderelite; 04.11.2016
comment
Да, ситуация с клонами имеет смысл. Для меня это может быть временным решением. Изменить: Но поскольку это не общедоступно, мне нужно будет настроить SSH ... работая над этим. - person ; 04.11.2016

Мое решение оказалось следующим:

  1. Зарегистрируйте учетные данные SSH для доступа к Github на TC Agent.

  2. git clone ssh://[email protected]/account-name/repo.git /var/tmp/projectname_tmp

  3. cd в каталог /var/tmp/projectname_tmp

  4. git log >> output.file

Чтобы получить бонусные баллы, вы можете извлечь из заданной даты следующим образом:

  1. git log --since='2016-11-01 03:00' >> output.log
person Community    schedule 05.11.2016

Вам не нужно клонировать репо, чтобы получить журнал. В TeamCity уже есть список файлов и сообщения о фиксации, которые запустили сборку. Вы можете просто запросить TeamCity API на этапе сценария и получить журнал. Вот две функции Powershell, которые я использую для этого.

TeamCityGetChangeLog требует URL-адреса сервера, имени пользователя, пароля и идентификатора сборки (который вы можете передать из параметров TeamCity).

# Gets the change log for the specified build ID
function TeamCityGetChangeLog([string] $serverUrl, [string] $username, [string] $password, [int] $buildId){
    $changelog = ''

    # If the build is running inside TeamCity
    if ($env:TEAMCITY_VERSION) {
        $buildUrl = "$serverUrl/httpAuth/app/rest/changes?build=id:$($buildId)"
        $authToken = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($username + ":" + $password))

        # Get all the changes
        $request = [System.Net.WebRequest]::Create($buildUrl)
        $request.Headers.Add("Authorization", "Basic $authToken");
        $xml = [xml](new-object System.IO.StreamReader $request.GetResponse().GetResponseStream()).ReadToEnd()

        # Get all commit messages for each of them
        $changelog = Microsoft.PowerShell.Utility\Select-Xml $xml -XPath `
            "/changes/change" | Foreach {
                TeamCityGetCommitMessage $serverUrl $username $password $_.Node.id
            }
    }

    return $changelog
}

Это зависит от TeamCityGetCommitMessage, для которого также требуется идентификатор набора изменений.

# Get the commit messages, and files changed for the specified change id
# Ignores empty lines, lines containing "#ignore", "merge branch"" or "TeamCity"
function TeamCityGetCommitMessage([string]$serverUrl, [string]$username, [string]$password, [int]$changeId)
{
    $getFilesChanged = $false;
    $request = [System.Net.WebRequest]::Create("$serverUrl/httpAuth/app/rest/changes/id:$changeId")
    $authToken = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($username + ":" + $password))
    $request.Headers.Add("Authorization", "Basic $authToken");

    $xml = [xml](new-object System.IO.StreamReader $request.GetResponse().GetResponseStream()).ReadToEnd()

    Microsoft.PowerShell.Utility\Select-Xml $xml -XPath "/change" |
        where { ($_.Node["comment"].InnerText.Length -ne 0) `
        -and (-Not $_.Node["comment"].InnerText.Contains('#ignore')) `
        -and (-Not $_.Node["comment"].InnerText.StartsWith("Merge branch")) `
        -and (-Not $_.Node["comment"].InnerText.StartsWith("TeamCity change"))} |
        foreach {
            $getFilesChanged = $true
            $username = (&{If($_.Node["user"] -ne $null) {$_.Node["user"].name.Trim()} Else { $_.Node.Attributes["username"].Value }})
            "<br /><strong>$($username + " on " + ([System.DateTime]::ParseExact($_.Node.Attributes["date"].Value, "yyyyMMddTHHmmsszzzz", [System.Globalization.CultureInfo]::InvariantCulture)))</strong><br /><br />"

            "$($_.Node["comment"].InnerText.Trim().Replace("`n", "`n<br />"))"
        }

    if ($getFilesChanged) {
        "<br /><br /><strong>Files Changed</strong><br /><br />"
        Microsoft.PowerShell.Utility\Select-Xml $xml -XPath "/change/files" |
        where { ($_.Node["file"].Length -ne 0)} |
        foreach { Select-Xml $_.Node -XPath 'file' |
            foreach { "$($_.Node.Attributes["file"].Value)<br />" }
        }
    }
}
person Ben Richards    schedule 11.11.2016
comment
Спасибо, Боян. Несмотря на то, что на самом деле это не ответ на мой вопрос (оболочка и терминал (подразумевается Linux)), это все же хороший ресурс для других. - person ; 18.11.2016