【问题标题】:Commit/Push Changes to Azure DevOps Repository At End of Build在构建结束时提交/推送更改到 Azure DevOps 存储库
【发布时间】:2019-10-18 14:55:24
【问题描述】:

作为构建过程的一部分,我们会更新版本号,并且我们希望提交更改并将更改推送回主存储库。这是托管在 azure devops 上的 git 存储库,第一步使用获取源代码:

我使用以下代码在管道末尾添加了一个命令行任务。似乎有问题,我该如何正确执行此操作?谢谢。

git config --global user.email "my@email.address.com"
git config --global user.name "VSTS Admin"
git status

ECHO SOURCE BRANCH IS %BUILD_SOURCEBRANCH%

ECHO ADDING MODIFIED FILES
git add *.cs
git add *.build
git add *.wxs

ECHO CREATING COMMIT
git commit -m "Update version numbers for Build %BUILD_BUILDNUMBER%"
git push origin master

结果如下:

##[section]Starting: Commit/Push Changes To Git Repo
==============================================================================
Task         : Command Line
Description  : Run a command line script using cmd.exe on Windows and bash on macOS and Linux.
Version      : 2.148.0
Author       : Microsoft Corporation
Help         : [More Information](https://go.microsoft.com/fwlink/?LinkID=613735)
==============================================================================
Generating script.
========================== Starting Command Output ===========================
##[command]"C:\windows\system32\cmd.exe" /D /E:ON /V:OFF /S /C "CALL "D:\a\_temp\8b19361b-8f47-4d31-834d-132fedb0b386.cmd""
HEAD detached at e7a1479d
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   ../../../Properties/AssemblyInfo.cs
        .. (more files modified)

SOURCE BRANCH IS refs/heads/master
ADDING MODIFIED FILES
CREATING COMMIT
[detached HEAD 5c1bf6dc] Update version numbers for Build myBuildNumber_5.1.001
 2 files changed, 2 insertions(+), 2 deletions(-)
error: src refspec master does not match any
error: failed to push some refs to     'https://{org}@dev.azure.com/{projectName}/_git/{reponame}'
##[error]Cmd.exe exited with code '1'.
##[section]Finishing: Commit/Push Changes To Git Repo

【问题讨论】:

    标签: git azure-devops


    【解决方案1】:

    需要注意的是:

    1. Azure Pipeline 在触发管道的提交时执行 git checkout。
      例如:git checkout &lt;commit-hash-SHA1&gt;
    2. 这被称为 分离的 HEAD 状态,因为存储库的头部而不是指向任何有效的分支,它现在指向提交本身。 (即 HEAD 已分离)
    3. 由于我们处于分离的 HEAD 状态,我们不能直接推回,而是可以使用以下方法直接推到目标分支。
      例如:git push &lt;remote-repo-url&gt; HEAD:refs/heads/&lt;target-branch&gt; 可以是 origin 或完全限定的 repo-url
      git push url_with_pat HEAD:refs/heads/&lt;target-branch&gt;(网址还可以包含格式为:
      https://&lt;username&gt;:&lt;PAT&gt;@github.com/&lt;username&gt;/&lt;repo&gt;.git
      通过这种方式,我们将处于分离状态的当前管道本地提交历史附加到我们想要的任何目标分支。
    4. 由于我们仍然需要目标分支(或触发构建的源分支),我们可以使用 environment variable $(Build.SourceBranch),它属于 format /refs/head/&lt;branch&gt;,因为它处于分离状态模式 (uses refs-heads)

    如果您出于某种原因试图不签出分支,这将特别有用

    如果不需要上述方法,那么仍然可以使用经典的git checkout -b &lt;branch&gt; 直接结帐特定分支

    注意:可以用修剪后的 $(Build.SourceBranch) 替换,其中前缀 /refs/heads/ 可以在使用前删除

    【讨论】:

      【解决方案2】:

      src refspec master does not match any”表示没有本地master分支可以推送。

      这是因为提交是在分离的 HEAD(无分支)中创建的

      在添加和提交之前,您必须先使用git checkout -b master 创建主分支。
      更准确地说,如I mentioned here

      git checkout master 2>/dev/null || git checkout -b master;
      

      OP dan 确认in the comments

      当它在上一步中获取源时,它签出到与 master 不同的分支 (git checkout --progress --force e7a1479dc5d2139be5247a027721e2a88b44a890)

      根据定义,提交的签出直接导致分离的 HEAD。

      【讨论】:

      • 谢谢。那行得通。当它在上一步中获取源时,它签出到与 master 不同的分支(git checkout --progress --force e7a1479dc5d2139be5247a027721e2a88b44a890)
      • @dan 太好了!我已将您的评论包含在答案中以提高知名度。
      猜你喜欢
      • 2019-03-04
      • 1970-01-01
      • 2020-12-08
      • 2020-06-27
      • 2021-11-05
      • 2019-09-09
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多