buildkit icon indicating copy to clipboard operation
buildkit copied to clipboard

branch/tag confusion with Git checkout using `--keep-git-dir`

Open jedevc opened this issue 1 year ago • 1 comments

Given the following Dockerfile:

FROM alpine

RUN apk add git tree

# note that v0.12.4 is ambiguous
ADD --keep-git-dir=true https://github.com/moby/buildkit.git#v0.12.4 /repo
WORKDIR /repo
RUN git tag -l
RUN git branch -v
RUN git status
RUN tree .git/refs

We get the following output on a build:

#6 git://github.com/moby/buildkit.git#v0.12.4
#6 0.050 Initialized empty Git repository in /var/lib/buildkit/runc-overlayfs/snapshots/snapshots/3/fs/
#6 2.204 833949d0f7908608b00ab6b93b8f92bdb147fcca	refs/tags/v0.12.4
#6 ...

...

#6 git://github.com/moby/buildkit.git#v0.12.4
#6 6.497 From https://github.com/moby/buildkit
#6 6.497  * [new tag]         v0.12.4    -> v0.12.4
#6 6.525 Initialized empty Git repository in /var/lib/buildkit/runc-overlayfs/snapshots/snapshots/6/fs/.git/
#6 6.529 commit
#6 6.950 From file:///var/lib/buildkit/runc-overlayfs/snapshots/snapshots/3/fs
#6 6.950  * [new tag]         v0.12.4    -> v0.12.4
#6 6.950  * [new tag]         v0.12.4    -> v0.12.4
#6 7.274 Note: switching to 'FETCH_HEAD'.
#6 7.274 
#6 7.274 You are in 'detached HEAD' state. You can look around, make experimental
#6 7.274 changes and commit them, and you can discard any commits you make in this
#6 7.274 state without impacting any branches by switching back to a branch.
#6 7.274 
#6 7.274 If you want to create a new branch to retain commits you create, you may
#6 7.274 do so (now or later) by using -c with the switch command. Example:
#6 7.274 
#6 7.274   git switch -c <new-branch-name>
#6 7.274 
#6 7.274 Or undo this operation with:
#6 7.274 
#6 7.274   git switch -
#6 7.274 
#6 7.274 Turn off this advice by setting config variable advice.detachedHead to false
#6 7.274 
#6 7.274 HEAD is now at 833949d Merge pull request #4452 from crazy-max/v0.12.4_cherry-picks
#6 DONE 9.5s

#8 [3/7] ADD --keep-git-dir=true https://github.com/moby/buildkit.git#v0.12.4 /repo
#8 DONE 0.4s

#9 [4/7] WORKDIR /repo
#9 DONE 0.1s

#10 [5/7] RUN git tag -l
#10 0.108 v0.12.4
#10 DONE 0.1s

#11 [6/7] RUN git branch -v
#11 0.097 * (no branch) 833949d Merge pull request #4452 from crazy-max/v0.12.4_cherry-picks
#11 0.097   v0.12.4     833949d Merge pull request #4452 from crazy-max/v0.12.4_cherry-picks
#11 DONE 0.1s

#12 [7/7] RUN git status
#12 0.288 Not currently on any branch.
#12 0.288 nothing to commit, working tree clean
#12 DONE 0.3s

#13 [8/8] RUN tree .git/refs
#13 0.134 .git/refs
#13 0.134 ├── heads
#13 0.134 │   └── v0.12.4
#13 0.134 └── tags
#13 0.134     └── v0.12.4
#13 0.134 
#13 0.134 3 directories, 2 files
#13 DONE 0.2s

Note that we clone v0.12.4, a tag in the https://github.com/moby/buildkit repository. However, we can see that a branch v0.12.4 has also been created, in addition to a tag. Ideally, we shouldn't do this, since this makes it an ambiguous ref.

Observed against buildkit version v0.12.4 and master.

Related:

  • https://github.com/moby/buildkit/issues/4446

jedevc avatar Jan 15 '24 13:01 jedevc

Did a brief investigation (will probably return at some point), but this seems related to https://github.com/moby/buildkit/blob/a09112603a36532b8e44ade74ee3fd8383f4b708/source/git/source.go#L561

If I change this line to pullref += ":refs/remotes/origin/" + pullref then instead of the output:

#6 6.950 From file:///var/lib/buildkit/runc-overlayfs/snapshots/snapshots/3/fs
#6 6.950  * [new tag]         v0.12.4    -> v0.12.4
#6 6.950  * [new tag]         v0.12.4    -> v0.12.4

I get:

#6 2.739 From file:///var/lib/buildkit/runc-overlayfs/snapshots/snapshots/3/fs
#6 2.739  * [new tag]         v0.12.4    -> origin/v0.12.4
#6 2.739  * [new tag]         v0.12.4    -> v0.12.4

And then only get the tag, and not the branch as well. But I'm not familiar enough with the refspec syntax to immediately identify why this is.

jedevc avatar Jan 15 '24 14:01 jedevc