2015-12-04 51 views
4

我有一個託管在VSTS上的存儲庫,包含一個通過git-lfs存儲的文件。如果我只是讓VSTS構建版本庫,它只會下載包含文件ID的git-lfs元數據文件。查看VSTF上的git-lfs文件build

下面是輸出VSTS如何得到它的源:

Syncing repository: MyRepo (Git) 
Checking out c84ef2f2bbad4fa3dc70dbd4100534390b9c8f18 to d:\work\73\s 
Checked out branch refs/heads/develop for repository MyRepo at commit c84ef2f2bbad4fa3dc70dbd4100534390b9c8f18 

什麼我需要做的,簽出真正的文件?

編輯:我假設我需要在VSTS簽出源代碼後手動調用git lfs fetch。但是在這種情況下,我如何處理身份驗證(這是VSTS所要求的)?

+0

我同意你的看法,你需要調用「git lfs fetch」。對於認證部分,您可以爲您的Visual Studio Team Services帳戶創建一個「個人訪問令牌」。檢查此鏈接瞭解詳細:https://msdn.microsoft.com/en-us/Library/vs/alm/Code/git/command-prompt#GetsetuptousethecommandprompttoolsCreateapersonalaccesstokenforyourVisualStudioTeamServicesaccount –

+0

但在這種情況下,我需要定義一個單獨的服務帳戶,這可用於訪問代碼並將其憑據存儲在構建代理上。通常,構建代理可以在不需要服務帳戶的情況下籤出源代碼。有沒有辦法從cmd或ps腳本使用相同的方法? –

回答

5

該過程已再次更新(2017年3月)。這次您需要編輯構建定義的「獲取源」部分。啓用右上角的「高級設置」選項,並選中「從LFS簽出文件」選項。

enter image description here

0

VSTS現在有一個Allow Scripts to Access OAuth Token選項。通過在構建定義上設置此選項,OAuth可用於構建腳本。

我創建了一個extension,其中包含構建任務,這些構建任務將遠程URL更改爲使用OAuth令牌訪問遠程存儲庫。

4

更新

VSTS現在支持Git的LFS開箱。這只是在構建定義中激活選項Repository/Checkout files from LFS的問題。這比下面的解決方案簡單得多。


我想帕斯卡Enable Git Remote Access建設的任務,但我不能使它發揮作用。調用git-lfs.exe不會崩潰,但它不會將LFS文件轉換爲真實文件。

下面是我如何使它工作。我首先必須在我的構建定義中啓用Allow Scripts to Access OAuth Token選項。然後我創建了一個PowerShell腳本,拉的LFS依賴性:

# Inspired from here: http://ss64.com/ps/syntax-set-eol.html 
function Set-UnixLineEndings([string]$file) 
{ 
    # Replace CR+LF with LF 
    $text = [IO.File]::ReadAllText($file) -replace "`r`n", "`n" 
    [IO.File]::WriteAllText($file, $text) 

    # Replace CR with LF 
    $text = [IO.File]::ReadAllText($file) -replace "`r", "`n" 
    [IO.File]::WriteAllText($file, $text) 
} 

if ((Test-Path env:SYSTEM_ACCESSTOKEN) -eq $false) 
{ 
    throw "OAuth token not available. Make sure that you select the option 'Allow Scripts to Access OAuth Token' in build 'Options' pane." 
} 

# git lfs needs the credentials of the git repository. When running 
# under VSTS, these credentials are transfered to the git-lfs.exe 
# application using the oauth token provided by VSTS. These 
# credentials are stored in a file so that git lfs can find them. 

$pwPath = Join-Path $PSScriptRoot pw.txt 
$gitPwPath = $pwPath.Replace('\', '/') # Needs to be in unix format. 

$repoUri = New-Object Uri $env:BUILD_REPOSITORY_URI 

git config credential.helper "store --file=$gitPwPath" 
@" 
https://OAuth:$env:[email protected]$($repoUri.Host) 
"@ | Set-Content $pwPath 

# Again, needs to be in unix format... sigh... 
Set-UnixLineEndings -file $pwPath 

& ".\git-lfs.exe" pull 
if ($LASTEXITCODE -ne 0) 
{ 
    throw 'Failed to pull LFS files.' 
} 

顯然,這假定您已經存儲的git-lfs.exe使用Git存儲庫,該文件沒有被LFS跟蹤。

+0

有一個[開放問題](https://github.com/github/git-lfs/issues/906)與git-lfs,它不支持在遠程Url傳遞的憑據。像你一樣在一個文件中存儲令牌是目前唯一支持的方式。 –

+0

這個腳本就像一個魅力。謝謝。 – Filimindji

3

更新

我確認改變的過程中,請忽略以下答案。


我不得不說,我只是發現:

在構建定義中,選擇選項卡,從LFS勾選結帳文件

它不能更輕鬆。

+0

是的,與此同時,此功能在VSTS中開箱即用。因此接受這個答案作爲解決方案。 –