我很清楚,在为 Jenkins 作业编写管道脚本时,好的做法是每次运行作业时重新克隆存储库,但是我确实发现自己希望只提取分支内容或签出修订版本,然后运行这方面的工作(至少在某些情况下)。
但是我想让用户指定要签出的哈希值或分支名称。
如果它是分支名称,那么 git pull 是合适的,因为用户可能会推送新内容来尝试该作业。
但是如果指定的修订版是散列,那么我们将处于分离的 HEAD 模式,并且
git pull
将失败并显示
You are not currently on a branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
如何消除此错误或仅在指定的分支时运行
git pull
?或者完全规避这个问题?
我找到了一些代码来检查通过的修订是否是分支,但我发现它有点烦躁:
git show-ref --verify --quiet refs/heads/${params.revision}
if %ERRORLEVEL% EQU 0 git pull
还有更自然的建议吗?
以下 2 个命令集适用于提交 ID 和分支名称:
git fetch origin <commit-ID-or-branch-name>
git checkout <commit-ID-or-branch-name>
请注意,
checkout
命令可用于提交 ID 和分支名称,而无需指定 --detach
选项。如果您的管道不需要在分支上创建新提交,那么即使您正在签出分支,最好始终使用提交 ID,在这种情况下,您应该使用 --detach
选项和 checkout
,或者,您也可以使用 switch
命令:
git fetch origin <commit-ID-or-branch-name>
git switch --detach <commit-ID-or-branch-name>
旁注: 检查特定提交与
pull
略有不同。由于您问题的前提是将拉取与新克隆进行比较,那么这在功能上是等效的,并且实际上在概念上比pull
更“干净”,因为它忽略了未知本地提交污染构建的可能性。