如何将本地更改同步到SECOND Git存储库?

时间:2018-06-19 23:22:14

标签: git tfs azure-devops

我正在为他拥有源代码的客户项目使用本地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发布步骤中完全自动化此任务?

1 个答案:

答案 0 :(得分:0)

我可以结合使用以下答案来实现此目的:

  
      
  1. https://stackoverflow.com/a/45224858/722393
  2.   
  3. https://stackoverflow.com/a/50925741/722393
  4.   

诀窍是使用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
        }
    }
}