{"id":1237,"date":"2026-09-11T10:55:52","date_gmt":"2026-09-11T10:55:52","guid":{"rendered":"https:\/\/techno.slomka.biz\/?p=1237"},"modified":"2026-09-11T10:59:10","modified_gmt":"2026-09-11T10:59:10","slug":"skipping-a-gitlab-pipeline-skip-ci-works-skip_ci-doesnt","status":"publish","type":"post","link":"https:\/\/techno.slomka.biz\/?p=1237","title":{"rendered":"Skipping a GitLab Pipeline: `[skip ci]` Works, `[skip_ci]` Doesn&#8217;t"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I just found out how to prevent a pipeline from starting when pushing to GitLab by using the commit message. That saves a lot of effort. It means I don&#8217;t have to rush to manually cancel the pipeline if I forget that a push triggers it. (An idempotent CI job shouldn&#8217;t have any issues with this, but during the development phase&#8230;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GitLab lets you push a commit without triggering a pipeline \u2013 as long as you spell the magic word correctly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## The two accepted forms<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GitLab recognizes exactly two keywords in the commit message:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;skip ci]\n&#91;ci skip]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Capitalization doesn&#8217;t matter, <code>[Skip CI]<\/code> or <code>[CI SKIP]<\/code>work just as well. <strong>**Anything else is plain text.**<\/strong> <code>[skip_ci]<\/code>` or <code>[skip-ci]<\/code> are ignored, and the pipeline starts as usual.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#304047;color:#d5ffff\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>git commit -m \"Update README &#91;skip ci&#93;\"<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme\" style=\"background-color: #263238\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #FFCB6B\">git<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">commit<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">-m<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #89DDFF\">&quot;<\/span><span style=\"color: #C3E88D\">Update README &#91;skip ci&#93;<\/span><span style=\"color: #89DDFF\">&quot;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">By the way, the pipeline doesn&#8217;t vanish completely: GitLab still creates an empty pipeline without jobs, shown with the status <strong>**Skipped**<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## Without touching the commit message<\/strong><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#EEFFFF;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#304047;color:#d5ffff\">Bash<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#EEFFFF;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>git push -o ci.skip<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme\" style=\"background-color: #263238\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #FFCB6B\">git<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">push<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">-o<\/span><span style=\"color: #EEFFFF\"> <\/span><span style=\"color: #C3E88D\">ci.skip<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Same effect, but as a push option. Handy when you don&#8217;t want to change the message \u2013 or when you are pushing someone else&#8217;s commit further and can&#8217;t.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keep in mind:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <code>ci.skip<\/code> only affects <strong>**branch pipelines**<\/strong>, not merge request pipelines.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; If you don&#8217;t even want the empty skipped pipeline, GitLab also offers <code>git push -o ci.no_pipeline<\/code> (check whether your GitLab version supports it).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Side note: GitHub Actions understands <code>[skip_ci]<\/code>` and <code>[skip-ci]<\/code> as well (plus <code>[no ci]<\/code>, <code>[skip actions]<\/code> and <code>[actions skip]<\/code>), but has no push option equivalent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>## In summary<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**<code>[skip ci]<\/code><\/strong> <strong>\/<\/strong> <strong><code>[ci skip]<\/code>**<\/strong>, any capitalization: pipeline skipped.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**<strong><code>[skip ci]<\/code><\/strong>**<\/strong>: just text, pipeline runs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; <strong>**<code>git push -o ci.skip<\/code>**<\/strong>: same effect without touching the commit \u2013 branch pipelines only.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I just found out how to prevent a pipeline from starting when pushing to GitLab by using the commit message. That saves a lot of effort. It means I don&#8217;t have to rush to manually cancel the pipeline if I forget that a push triggers it. (An idempotent CI job shouldn&#8217;t have any issues with this, but during the development phase&#8230;) GitLab lets you push a commit without triggering a pipeline \u2013 as long as you spell the magic word correctly. ## The two accepted forms GitLab recognizes exactly two keywords in the commit message: Capitalization doesn&#8217;t matter, [Skip CI] or [CI SKIP]work just as well. **Anything else is plain text.** [skip_ci]` or [skip-ci] are ignored, and the pipeline starts as usual. By the way, the pipeline doesn&#8217;t vanish completely: GitLab still creates an empty pipeline without jobs, shown with the status **Skipped**. ## Without touching the commit message Same effect, but as a push option. Handy when you don&#8217;t want to change the message \u2013 or when you are pushing someone else&#8217;s commit further and can&#8217;t. Keep in mind: &#8211; ci.skip only affects **branch pipelines**, not merge request pipelines. &#8211; If you don&#8217;t even want the empty skipped pipeline, GitLab also offers git push -o ci.no_pipeline (check whether your GitLab version supports it). Side note: GitHub Actions understands [skip_ci]` and [skip-ci] as well (plus [no ci], [skip actions] and [actions skip]), but has no push option equivalent. ## In summary &#8211; **[skip ci] \/ [ci skip]**, any capitalization: pipeline skipped. &#8211; **[skip ci]**: just text, pipeline runs. &#8211; **git push -o ci.skip**: same effect without touching the commit \u2013 branch pipelines only.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1237","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=\/wp\/v2\/posts\/1237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1237"}],"version-history":[{"count":4,"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=\/wp\/v2\/posts\/1237\/revisions"}],"predecessor-version":[{"id":1241,"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=\/wp\/v2\/posts\/1237\/revisions\/1241"}],"wp:attachment":[{"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techno.slomka.biz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}