我正在为他拥有源代码的客户项目使用本地TFS 2018实例。我希望他在无法使用时无法访问此代码。
我的建议是创建一个TFS发布步骤,以将我的TFS origin
与他的VSTS帐户中的存储库同步。
我已经能够使用this approach从我的工作站手动完成此操作:
cd /path/to/local/repo
git remote add tfs url://tfs/git/repo
git push --mirror tfs
但是系统提示我输入他的VSTS凭据,这显然在TFS发布步骤中不起作用。
此外,尝试从TFS服务器的桌面上remote add
时遇到此错误:
D:\Agent\_work\37\s>git remote add Application https://customer.visualstudio.com/Applications/_git/Application
Rename from 'D:/Agent/_work/37/s/.git/config.lock' to 'D:/Agent/_work/37/s/.git/config' failed. Should I try again? (y/n)
我可以在工作站上添加它,尽管它不会显示为push
可以提交给TFS的更改。因此,看来我无法将远程VSTS信息库告诉TFS。
如何在TFS发布步骤中完全自动化此任务?
答案 0 :(得分:0)
我可以结合使用以下答案来实现此目的:
诀窍是使用VSTS用户配置文件的“安全性”部分中的“个人访问令牌(PAT)”。
这是我最后得到的脚本:
在构建步骤中调用的SyncCode.ps1
[CmdletBinding()]
param(
[Parameter(Mandatory)][string] $Application,
[Parameter(Mandatory)][string] $LocalPath,
[Parameter(Mandatory)][string] $Token
)
. \\SERVER\Scripts\TfsBuild\Invoke-Git.ps1
$RemoteExists = $false
$AllRemotes = git remote
ForEach($Remote in $AllRemotes) {
If($Remote = $Application) {
$RemoteExists = $true
Break
}
}
If($RemoteExists) {
Invoke-Git -Command "remote remove $Application"
}
Invoke-Git -Command "remote add $Application https://Personal%20Access%20Token:$Token@customer.visualstudio.com/Applications/_git/$Application"
Set-Location $LocalPath
Invoke-Git -Command "push --mirror HydraMonitor"
从SyncCode.ps1调用的Invoke-Git.ps1
<#
.Synopsis
Invoke git, handling its quirky stderr that isn't error
.Outputs
Git messages, and lastly the exit code
.Example
Invoke-Git push
.Example
Invoke-Git "add ."
#>
Function Invoke-Git
{
param(
[Parameter(Mandatory)]
[string] $Command )
Write-Output "##[command]. git $Command"
Try {
$Exit = 0
$Path = [System.IO.Path]::GetTempFileName()
Invoke-Expression "git $Command 2> $Path"
$Exit = $LASTEXITCODE
If ( $Exit -gt 0 ) {
Write-Error (Get-Content $Path).ToString()
}
Else {
Get-Content $Path
}
"Exit code: $Exit"
}
Catch {
Write-Host "Error: $_`n$($_.ScriptStackTrace)"
}
Finally {
If ( Test-Path $Path ) {
Remove-Item $Path
}
}
}