Git shallow clone stragegy omits remote branches
## Summary When doing shallow fetch clones, not all remote branches are retrieved ## Steps to reproduce In our project, we want to create architecture specific branches from our main release branch. What the CI will do, checkout the current branch (gitlab-runner does this of course by default), and go over a list of available existing architecture branches to update these. To do so, it uses `git branch --list --remote "origin/stable/v0/*" | sed -n -r 's|.*origin/stable/v0/||p'` to obtain the list of 'v0' named branches. E.g. stable/v0/arm32v7, stable/v0/arm64v8. However, if git fetch is set with a depth parameter (I haven't confirmed what happens if you set it to 0). We can create a scenario where not all remotes have been retrieved. The work around for now appears to be either add a git fetch to the CI task (ugly) or (according to the documentation) set the depth to 0. <details> <summary> .gitlab-ci.yml </summary> ```yml .git: <<: *common_parameters image: registry.hub.docker.com/gitscm/git:latest before_script: - git config --local user.name "${GITLAB_USER_NAME}" - git config --local user.email "${GITLAB_USER_EMAIL}" - git config --local credential.helper "cache --timeout=2147483647" - printf "url=${CI_PROJECT_URL}\nusername=esbs-bot\npassword=${CI_PERSONAL_TOKEN}\n\n" | git credential approve - git remote set-url --push origin "https://esbs-bot@${CI_REPOSITORY_URL#*@}" after_script: - git credential-cache exit create_release_branches: extends: .git stage: release only: refs: - /^v\d+\.\d+$/ except: refs: - branches # Workaround for gitlab-org/gitlab-ce#27818 script: - git_tag="$(git describe --exact-match --match "v[0-9]*")" - git_tag_msg="$(git tag --format="%(contents:subject)%0a%0a%(contents:body)%0a%0a(Auto-created release candidate)" --list "${git_tag}")" - | git fetch --prune # Added as workaround for release_branch in "release" $(git branch --list --remote "origin/stable/v0/*" | sed -n -r 's|.*origin/stable/v0/||p'); do echo "Creating release branch '${release_branch}' from '${CI_COMMIT_REF_NAME}' (${CI_COMMIT_SHORT_SHA})" git checkout "${CI_COMMIT_SHA}" -b "stable/${CI_COMMIT_TAG:?}/${release_branch}" if [ "${release_branch}" != "release" ]; then sed -i 's|FROM registry.hub.docker.com/library/alpine|FROM registry.hub.docker.com/'"${release_branch}"'/alpine|g' "Dockerfile" git add "Dockerfile" git commit --message="${release_branch}: Auto-created release branch 'stable/${CI_COMMIT_TAG:?}/${release_branch}'." --no-edit release_prefix="${release_branch}/" fi git tag --annotate --message="${git_tag_msg:-See tag '${CI_COMMIT_TAG}'}" "${release_prefix:-}${CI_COMMIT_TAG}.0-rc1" git push --follow-tags origin "HEAD" done ``` </details> ## Actual behavior All remotes are available on the runner, albeit at a shallow depth of the main branch ## Expected behavior Even shallow fetch, should always retrieve all branches, not just the current branch. ## Relevant logs and/or screenshots I'll leave the repo for now, it could be found at https://gitlab.com/esbs/sandbox/package_builder-alpine.git ## Proposal As stated in https://gitlab.com/gitlab-org/gitlab-ce/issues/64686#note_192646764 not fetching all the branches is expected since we are only going far back X commits. As proposed in https://gitlab.com/gitlab-org/gitlab-ce/issues/64686#note_192646765 we should at this notice in the [shallow cloining](https://gitlab.com/gitlab-org/gitlab-ce/blob/1574d2839fa9a4258e28af92ed0c5c07df424161/doc/ci/yaml/README.md#L2550) documentation.
issue