如何在终端中获取 'git log' 或在不在存储库中时使用 shell 脚本
How do I get 'git log' in the terminal or using a shell script when not in a repository
我有 Teamcity 构建代理,我需要从存储库中提取 git log
。问题是,当我的 shell 脚本运行时,它不在 git 存储库中,所以 git log
不能开箱即用。
有谁知道如何做到这一点。
我已经搜索了文档,但似乎找不到任何方法。
目前解决的问题
当 Teamcity "clones" 从 Github 到代理的项目时,它实际上并没有克隆整个项目。所以 working directory
不是存储库。
当 运行 我的 shell 脚本时,我没有 SSH 访问 github,我需要它
提前致谢。
解决方案
请参阅下面已接受的答案。
使用git
命令的-C
标志。它允许您指定 git 目录。
git -C 'git-working-dir' log
我的解决方案最终如下:
注册 SSH 凭据以在 TC 代理上访问 Github。
git clone ssh://git@github.com/account-name/repo.git /var/tmp/projectname_tmp
cd
到目录 /var/tmp/projectname_tmp
git log >> output.file
对于奖励积分,您可以像这样从给定日期提取:
git log --since='2016-11-01 03:00' >> output.log
您无需克隆存储库即可获取日志。 TeamCity 已经有一个文件列表和触发构建的提交消息。您可以简单地在脚本步骤中查询 TeamCity API 并获取日志。这是我用来执行此操作的两个 Powershell 函数。
TeamCityGetChangeLog,需要服务器 url、用户名、密码和构建 ID(您可以从 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,它也需要更改集 ID。
# 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 />" }
}
}
}
我有 Teamcity 构建代理,我需要从存储库中提取 git log
。问题是,当我的 shell 脚本运行时,它不在 git 存储库中,所以 git log
不能开箱即用。
有谁知道如何做到这一点。
我已经搜索了文档,但似乎找不到任何方法。
目前解决的问题
当 Teamcity "clones" 从 Github 到代理的项目时,它实际上并没有克隆整个项目。所以
working directory
不是存储库。当 运行 我的 shell 脚本时,我没有 SSH 访问 github,我需要它
提前致谢。
解决方案
请参阅下面已接受的答案。
使用git
命令的-C
标志。它允许您指定 git 目录。
git -C 'git-working-dir' log
我的解决方案最终如下:
注册 SSH 凭据以在 TC 代理上访问 Github。
git clone ssh://git@github.com/account-name/repo.git /var/tmp/projectname_tmp
cd
到目录/var/tmp/projectname_tmp
git log >> output.file
对于奖励积分,您可以像这样从给定日期提取:
git log --since='2016-11-01 03:00' >> output.log
您无需克隆存储库即可获取日志。 TeamCity 已经有一个文件列表和触发构建的提交消息。您可以简单地在脚本步骤中查询 TeamCity API 并获取日志。这是我用来执行此操作的两个 Powershell 函数。
TeamCityGetChangeLog,需要服务器 url、用户名、密码和构建 ID(您可以从 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,它也需要更改集 ID。
# 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 />" }
}
}
}