在Azure DevOps管道(GetSources)中检出分支的一部分

时间:2019-06-04 10:37:08

标签: git azure-devops azure-pipelines

我组织的devops项目中的存储库包含许多.net解决方案以及一些统一项目。当我运行构建管道时,由于以下原因,该管道失败:

  

错误MSB3491:无法将行写入文件“ obj \ Release \ path \ to \ file”。磁盘上没有足够的空间。

我希望管道仅检出和获取成功构建所需的存储库部分。这可能也有助于缩短管道的执行时间,因为它目前还以GB的资源获取了我的整体项目,这需要花费很多时间。

我想将我的项目分布在多个存储库中,但是管理员给我的东西不多于已有的库。当我将git fetch配置为浅(--depth=1)时,效果会好很多,但是我仍然时不时地收到错误消息。

这是我配置结帐的方式:

  steps:
  - checkout: self
    clean: true
    # shallow fetch
    fetchDepth: 1
    lfs: false
    submodules: false

使用VSBuild@1任务完成构建。

除了使用多个存储库之外,我无法找到解决问题的有效方法。

编辑:Shayki Abramczyk的解决方案#1完美运行。这是我的完整实现。

GitSparseCheckout.yml

parameters:
  access: ''
  repository: ''
  sourcePath: ''

steps:
- checkout: none

- task: CmdLine@2
  inputs:
    script: |
      ECHO ##[command] git init
      git init
      ECHO ##[command] git sparse-checkout: ${{ parameters.sourcePath }}
      git config core.sparsecheckout true
      echo ${{ parameters.sourcePath }} >> .git/info/sparse-checkout
      ECHO ##[command] git remote add origin https://${{ parameters.repository }}
      git remote add origin https://${{ parameters.access }}@${{ parameters.repository }}
      ECHO ##[command] git fetch --progress --verbose --depth=1 origin master
      git fetch --progress --verbose --depth=1 origin master
      ECHO ##[command] git pull --progress --verbose origin master
      git pull --progress --verbose origin master

这样的Checkout称为(必须调整模板路径):

  - template: ../steps/GitSparseCheckout.yml
    parameters:
      access: anything:<YOUR_PERSONAL_ACCESS_TOKEN>
      repository: dev.azure.com/organisation/project/_git/repository
      sourcePath: path/to/files/

3 个答案:

答案 0 :(得分:3)

其他答案很好用,但是我发现使用git的潜在新功能的方式有所不同。

这将提取到1的深度,并显示根文件夹中的所有文件以及var path = require('path'); const port = process.env.PORT ||3000; const app = express(); //Set the base path to the angular-test dist folder app.use(express.static(path.join(__dirname, 'dist/yourappfolder'))); //Any routes will be redirected to the angular app app.get('*', function(req, res) { res.sendFile(path.join(__dirname, 'dist/yourappfolder/index.html')); }); //Starting server on port 8081 app.listen(port, () => { console.log('Server started!'); console.log(port); }); folder1folder2

folder3

答案 1 :(得分:3)

这个答案应该更新,因为我们(现在)可以像这样结帐参考

resources:
  repositories:
  - repository: MyGitHubRepo
    type: github
    endpoint: MyGitHubServiceConnection
    name: MyGitHubOrgOrUser/MyGitHubRepo
    ref: features/tools

steps:
- checkout: MyGitHubRepo

或者像这样使用内联语法

- checkout: git://MyProject/MyRepo@features/tools # checks out the features/tools branch
- checkout: git://MyProject/MyRepo@refs/heads/features/tools # also checks out the features/tools branch
- checkout: git://MyProject/MyRepo@refs/tags/MyTag # checks out the commit referenced by MyTag.

更多信息可以在here

答案 2 :(得分:1)

在Azure DevOps中,您没有选择仅获取部分存储库的选项,但是有一种解决方法,请禁用“获取源代码”步骤并手动获取源代码(仅根据需要):

要禁用默认的“获取来源”,只需在结帐时指定none

- checkout: none

在管道中添加CMD / PowerShell任务,以使用以下2个选项之一手动获取源:

1)使用git sparse-checkout仅获取部分仓库,例如,仅获取src文件夹下的文件夹test

- script: |
   mkdir myRepo
   cd myRepo
   git init
   git config.core.sparsecheckout true
   echo test/src/ >> .git/info/sparse-checkout
   git remote add -f origin path/to/your/repo
   git pull origin master
  displayName: 'Get only test/src folder'

现在,buils任务中将myRepo作为工作目录。

2)使用Azure DevOps Rest API(Git-Items-Batch Items)获取仓库的一部分。

在管道的最后,您可能需要添加步骤以清理repo文件夹。