support/download: fetch all refs on full git clone
PATCH 1/1 support/download: fetch all refs on full git clone
When specifying BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION, a user may want to specify the SHA of a reference different than a branch or tag.
For instance, Gerrit stores the patchsets under refs/changes/xx/xxx, and Github stores the pull requests under refs/pull/xxx/head.
When cloning a repository with --bare, you don't fetch these references. This patch uses --mirror for a full clone, in order to give the user access to all references of the Git repository.
--- support/download/git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
support/download/git +1 -1
@@ -43,7 +43,7 @@ if [ -n "$(${GIT} ls-remote "${repo}" "${cset}" 2>&1)" ]; then fi if [ ${git_done} -eq 0 ]; then printf "Doing full clone\n" - ${GIT} clone ${verbose} --bare "${repo}" "${basename}" + ${GIT} clone ${verbose} --mirror "${repo}" "${basename}" fi GIT_DIR="${basename}" \
Signature · 1 line
2.6.2
PATCH 1/1 support/download: fetch all refs on full git clone
Hi Vivien, all
Quoted 32 lines · Vivien Didelot
When specifying
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION, a user may want to specify the SHA of a reference different than a branch or tag.For instance, Gerrit stores the patchsets under refs/changes/xx/xxx, and Github stores the pull requests under refs/pull/xxx/head.
When cloning a repository with --bare, you don't fetch these references. This patch uses --mirror for a full clone, in order to give the user access to all references of the Git repository.
Signed-off-by Vivien Didelot <[email protected]>--- support/download/git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)support/download/git +0
-0@@ -43,7 +43,7 @@ if [ -n "$(${GIT} ls-remote "${repo}" "${cset}" 2>&1)"]; then
fi
if [ ${git_done} -eq 0 ]; then
printf "Doing full clone\n"support/download/git +1
-2- ${GIT} clone ${verbose} --bare "${repo}" "${basename}" + ${GIT} clone ${verbose} --mirror "${repo}" "${basename}" fi GIT_DIR="${basename}" \ --2.6.2
Quoted 1 line
I've read the different between bare and mirror and from what I
understand, mirrors implies bare and also maps the remotes branch to the local branches.
Given that understanding, I am afraid I don't really get what you are trying to do. From what I understand of Git, everything has a SHA ID, be it, branches, tags, merge commit, even when you push -f you still have access to previous state of your HEAD.
I cloned a repository from Github that had pull requests ongoing, I could not find anything non-standard under .git/refs/, is there a specific example that you could point to ? I don't know Gerrit nor how it works, so maybe this was the issues you had ?
Finally, with the current mechanisms, you can specify a SHA, so if you are trying to clone a PR, since it should be made from either a branch from the local repository, or a whole other repository, you should be able to specify it.
Again, I'm not sure I got what you were trying to do, maybe there's a special use cases with Gerrit that I'm not aware of.
Quoted 5 lines
_______________________________________________
buildroot mailing list
buildroot at busybox.net
http://lists.busybox.net/mailman/listinfo/buildroot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20151112/4abcf84a/attachment.html>
PATCH 1/1 support/download: fetch all refs on full git clone
Hi Maxime,
Quoted 33 lines · Maxime Hadjinlian
Hi Vivien, all
Quoted 28 lines · Vivien Didelot
When specifying
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION, a user may want to specify the SHA of a reference different than a branch or tag.For instance, Gerrit stores the patchsets under refs/changes/xx/xxx, and Github stores the pull requests under refs/pull/xxx/head.
When cloning a repository with --bare, you don't fetch these references. This patch uses --mirror for a full clone, in order to give the user access to all references of the Git repository.
Signed-off-by Vivien Didelot <[email protected]>--- support/download/git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)support/download/git +0
-0@@ -43,7 +43,7 @@ if [ -n "$(${GIT} ls-remote "${repo}" "${cset}" 2>&1)"]; then
fi
if [ ${git_done} -eq 0 ]; then
printf "Doing full clone\n"support/download/git +1
-1- ${GIT} clone ${verbose} --bare "${repo}" "${basename}" + ${GIT} clone ${verbose} --mirror "${repo}" "${basename}" fi
Quoted 7 lines
Quoted 4 lines
GIT_DIR="${basename}" \
--
2.6.2I've read the different between bare and mirror and from what I understand, mirrors implies bare and also maps the remotes branch to the local branches.
Both maps source and target branches. But --mirror also maps *all* refs, i.e. any (standard) ref that is not a tag or a branch.
Quoted 10 lines
Given that understanding, I am afraid I don't really get what you are trying to do. From what I understand of Git, everything has a SHA ID, be it, branches, tags, merge commit, even when you push -f you still have access to previous state of your HEAD.
I cloned a repository from Github that had pull requests ongoing, I could not find anything non-standard under .git/refs/, is there a specific example that you could point to ? I don't know Gerrit nor how it works, so maybe this was the issues you had ?
Quoted 7 lines
Finally, with the current mechanisms, you can specify a SHA, so if you are trying to clone a PR, since it should be made from either a branch from the local repository, or a whole other repository, you should be able to specify it.
Again, I'm not sure I got what you were trying to do, maybe there's a special use cases with Gerrit that I'm not aware of.
Here's an example with Github:
$ git clone git at github.com:maximeh/leaflet.bouncemarker.git --bare /tmp/github.bare
$ git -C /tmp/github.bare show refs/pull/24/head # => unknown revision
$ git -C /tmp/github.bare show bd029a9ace8810259f73933894b665f5b0a5bb36 # => bad object $ git clone git at github.com:maximeh/leaflet.bouncemarker.git --mirror /tmp/github.mirror
$ git -C /tmp/github.mirror show refs/pull/24/head
$ git -C /tmp/github.mirror show bd029a9ace8810259f73933894b665f5b0a5bb36Now an example with Gerrit:
$ git clone https://gerrit-ring.savoirfairelinux.com/ring-lrc --bare /tmp/gerrit.bare $ git -C /tmp/gerrit.bare show refs/changes/62/2462/8 # => unknown revision $ git -C /tmp/gerrit.bare show 6f5cf35b6644b0de2a3e005805b25e6a91a429cb # => bad object
$ git clone https://gerrit-ring.savoirfairelinux.com/ring-lrc --mirror /tmp/gerrit.mirror $ git -C /tmp/gerrit.mirror show refs/changes/62/2462/8 $ git -C /tmp/gerrit.mirror show 6f5cf35b6644b0de2a3e005805b25e6a91a429cb
With a mirror clone you can specify the target version as either the SHA or the ref path.
Off-topic: cgit nicely displays these refs in its Web interface too.
Thanks,
-v
PATCH 1/1 support/download: fetch all refs on full git clone
Hi Vivien, all
Quoted 101 lines · Vivien Didelot
Hi Maxime,
Quoted 6 lines · Maxime Hadjinlian
Hi Vivien, all
Quoted 1 line · Vivien Didelot
When specifying
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION, a user may wantto
Quoted 3 lines
Quoted 3 lines
specify the SHA of a reference different than a branch or tag.
For instance, Gerrit stores the patchsets under refs/changes/xx/xxx,
and
Quoted 3 lines
Quoted 3 lines
Github stores the pull requests under refs/pull/xxx/head.
When cloning a repository with --bare, you don't fetch these
references.
Quoted 8 lines
Quoted 8 lines
This patch uses --mirror for a full clone, in order to give the user access to all references of the Git repository.
Signed-off-by Vivien Didelot <[email protected]>--- support/download/git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)Quoted 5 lines
support/download/git if [ -n "$(${GIT} ls-remote "${repo}" "${cset}"
Quoted 5 lines
support/download/git +0
-0@@ -43,7 +43,7 @@ if [ -n "$(${GIT} ls-remote "${repo}" "${cset}"2>&1)"
Quoted 8 lines
Quoted 8 lines
]; then
fi
if [ ${git_done} -eq 0 ]; then
printf "Doing full clone\n"support/download/git +1
-1- ${GIT} clone ${verbose} --bare "${repo}" "${basename}" + ${GIT} clone ${verbose} --mirror "${repo}" "${basename}" fiQuoted 7 lines
Quoted 4 lines
GIT_DIR="${basename}" \
--
2.6.2I've read the different between bare and mirror and from what I understand, mirrors implies bare and also maps the remotes branch to the local branches.
Both maps source and target branches. But --mirror also maps *all* refs, i.e. any (standard) ref that is not a tag or a branch.
Quoted 8 lines
Given that understanding, I am afraid I don't really get what you are trying to do. From what I understand of Git, everything has a SHA ID, be it, branches, tags, merge commit, even when you push -f you still have access to previous state of your HEAD.
I cloned a repository from Github that had pull requests ongoing, I could not find anything non-standard under .git/refs/, is there a specific example that you could point to ? I don't know Gerrit nor how it works,
so
Quoted 3 lines
maybe this was the issues you had ?
Finally, with the current mechanisms, you can specify a SHA, so if you
are
Quoted 1 line
trying to clone a PR, since it should be made from either a branch from
the
Quoted 5 lines
local repository, or a whole other repository, you should be able to specify it.
Again, I'm not sure I got what you were trying to do, maybe there's a special use cases with Gerrit that I'm not aware of.
Here's an example with Github:
$ git clone git at github.com:maximeh/leaflet.bouncemarker.git --bare /tmp/github.bare $ git -C /tmp/github.bare show refs/pull/24/head # => unknown revision $ git -C /tmp/github.bare show bd029a9ace8810259f73933894b665f5b0a5bb36 # => bad object$ git clone git at github.com:maximeh/leaflet.bouncemarker.git --mirror /tmp/github.mirror $ git -C /tmp/github.mirror show refs/pull/24/head $ git -C /tmp/github.mirror show bd029a9ace8810259f73933894b665f5b0a5bb36Now an example with Gerrit:
$ git clone https://gerrit-ring.savoirfairelinux.com/ring-lrc --bare /tmp/gerrit.bare $ git -C /tmp/gerrit.bare show refs/changes/62/2462/8 # => unknown revision $ git -C /tmp/gerrit.bare show 6f5cf35b6644b0de2a3e005805b25e6a91a429cb # => bad object$ git clone https://gerrit-ring.savoirfairelinux.com/ring-lrc --mirror /tmp/gerrit.mirror $ git -C /tmp/gerrit.mirror show refs/changes/62/2462/8 $ git -C /tmp/gerrit.mirror show 6f5cf35b6644b0de2a3e005805b25e6a91a429cb
Quoted 6 lines
With a mirror clone you can specify the target version as either the SHA or the ref path.
Off-topic: cgit nicely displays these refs in its Web interface too.
Thanks a lot for your detailed explanation, I did not knew that. With that
understanding, your changes seems perfectly fine to me.
Let's wait to see what other thinks but I don't see how it could break anything since bare is a subset of mirror.
Thanks,
Quoted 2 lines
-v
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20151112/784030e4/attachment.html>
PATCH 1/1 support/download: fetch all refs on full git clone
Quoted 111 lines · Maxime Hadjinlian
Hi Vivien, all
Quoted 106 lines · Vivien Didelot
Hi Maxime,
Quoted 6 lines · Maxime Hadjinlian
Hi Vivien, all
Quoted 1 line · Vivien Didelot
When specifying
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION, a user may wantto
Quoted 3 lines
Quoted 3 lines
specify the SHA of a reference different than a branch or tag.
For instance, Gerrit stores the patchsets under refs/changes/xx/xxx,
and
Quoted 3 lines
Quoted 3 lines
Github stores the pull requests under refs/pull/xxx/head.
When cloning a repository with --bare, you don't fetch these
references.
Quoted 8 lines
Quoted 8 lines
This patch uses --mirror for a full clone, in order to give the user access to all references of the Git repository.
Signed-off-by Vivien Didelot <[email protected]>--- support/download/git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)Quoted 5 lines
support/download/git if [ -n "$(${GIT} ls-remote "${repo}" "${cset}"
Quoted 5 lines
support/download/git +0
-0@@ -43,7 +43,7 @@ if [ -n "$(${GIT} ls-remote "${repo}" "${cset}"2>&1)"
Quoted 8 lines
Quoted 8 lines
]; then
fi
if [ ${git_done} -eq 0 ]; then
printf "Doing full clone\n"support/download/git +1
-1- ${GIT} clone ${verbose} --bare "${repo}" "${basename}" + ${GIT} clone ${verbose} --mirror "${repo}" "${basename}" fiQuoted 7 lines
Quoted 4 lines
GIT_DIR="${basename}" \
--
2.6.2I've read the different between bare and mirror and from what I understand, mirrors implies bare and also maps the remotes branch to the local branches.
Both maps source and target branches. But --mirror also maps *all* refs, i.e. any (standard) ref that is not a tag or a branch.
Quoted 8 lines
Given that understanding, I am afraid I don't really get what you are trying to do. From what I understand of Git, everything has a SHA ID, be it, branches, tags, merge commit, even when you push -f you still have access to previous state of your HEAD.
I cloned a repository from Github that had pull requests ongoing, I could not find anything non-standard under .git/refs/, is there a specific example that you could point to ? I don't know Gerrit nor how it works,
so
Quoted 3 lines
maybe this was the issues you had ?
Finally, with the current mechanisms, you can specify a SHA, so if you
are
Quoted 1 line
trying to clone a PR, since it should be made from either a branch from
the
Quoted 5 lines
local repository, or a whole other repository, you should be able to specify it.
Again, I'm not sure I got what you were trying to do, maybe there's a special use cases with Gerrit that I'm not aware of.
Here's an example with Github:
$ git clone git at github.com:maximeh/leaflet.bouncemarker.git --bare /tmp/github.bare $ git -C /tmp/github.bare show refs/pull/24/head # => unknown revision $ git -C /tmp/github.bare show bd029a9ace8810259f73933894b665f5b0a5bb36 # => bad object$ git clone git at github.com:maximeh/leaflet.bouncemarker.git --mirror /tmp/github.mirror $ git -C /tmp/github.mirror show refs/pull/24/head $ git -C /tmp/github.mirror show bd029a9ace8810259f73933894b665f5b0a5bb36Now an example with Gerrit:
$ git clone https://gerrit-ring.savoirfairelinux.com/ring-lrc --bare /tmp/gerrit.bare $ git -C /tmp/gerrit.bare show refs/changes/62/2462/8 # => unknown revision $ git -C /tmp/gerrit.bare show 6f5cf35b6644b0de2a3e005805b25e6a91a429cb # => bad object$ git clone https://gerrit-ring.savoirfairelinux.com/ring-lrc --mirror /tmp/gerrit.mirror $ git -C /tmp/gerrit.mirror show refs/changes/62/2462/8 $ git -C /tmp/gerrit.mirror show 6f5cf35b6644b0de2a3e005805b25e6a91a429cbWith a mirror clone you can specify the target version as either the SHA or the ref path.
Off-topic: cgit nicely displays these refs in its Web interface too.
Quoted 7 lines
Quoted 1 line
Thanks a lot for your detailed explanation, I did not knew that. With that
understanding, your changes seems perfectly fine to me.
Reviewed-by "Maxime Hadjinlian" <[email protected]>Let's wait to see what other thinks but I don't see how it could break anything since bare is a subset of mirror.
The change seemed OK to Thomas and Yann on IRC, I add them in the loop.
This is orthogonal, but I'm wondering if it'd make sense to stamp a git remote update, similary to the local kernel setup + rsync. That would ease the build process of a team, when a parallel kernel development is on going.
Thanks for the review,
-v
PATCH 1/1 support/download: fetch all refs on full git clone
On 12-11-15 18:07, Vivien Didelot wrote:
[snip]
Quoted 4 lines
This is orthogonal, but I'm wondering if it'd make sense to stamp a git remote update, similary to the local kernel setup + rsync. That would ease the build process of a team, when a parallel kernel development is on going.
I'm not sure what you mean with stamping a git remote update. What I think
would make sense is that for distributed VCS downloads (i.e. git and hg) we keep a full (shallow) clone in DL_DIR in addition to the tarball. That makes handling updates a lot more efficient. We probably would want to expose that to PRIMARY and SECONDARY download sites as well. Especially the PRIMARY would be useful, since it would allow you to start from a local clone of e.g. linux.git (which may not have the ref you need), and then just fetch the missing refs from upstream.
This will not be easy to implement, though, since we'd need to handle e.g.
multiple remotes that end up in the same DL_DIR/foo.git repository.
Was this what you meant, Vivien?
Regards,
Arnout
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
PATCH 1/1 support/download: fetch all refs on full git clone
Hi Arnout,
Quoted 15 lines · Arnout Vandecappelle
On 12-11-15 18:07, Vivien Didelot wrote:
[snip]Quoted 4 lines
This is orthogonal, but I'm wondering if it'd make sense to stamp a git remote update, similary to the local kernel setup + rsync. That would ease the build process of a team, when a parallel kernel development is on going.
I'm not sure what you mean with stamping a git remote update. What I think
would make sense is that for distributed VCS downloads (i.e. git and hg) we keep a full (shallow) clone inDL_DIRin addition to the tarball. That makes handling updates a lot more efficient. We probably would want to expose that to PRIMARY and SECONDARY download sites as well. Especially the PRIMARY would be useful, since it would allow you to start from a local clone of e.g. linux.git (which may not have the ref you need), and then just fetch the missing refs from upstream.
Quoted 5 lines
This will not be easy to implement, though, since we'd need to handle e.g.
multiple remotes that end up in the same DL_DIR/foo.git repository.Was this what you meant, Vivien?
What I meant is, when you use BR2_LINUX_KERNEL_CUSTOM_LOCAL, Buildroot will stamp a .stamp_rsynced file and re-sync on later make linux-rebuild. This is really handy.
I don't think pointing to a Git repository is much different from this (especially during the development phase). Similary to rsync, git remote update can be used to sync a mirror clone (says the git-clone man page).
I'm thinking that we may either rework a generic $(1)-sync target which handles both rsync and git remote update, or introduce a $(1)-update target?
Caching full mirror clones is indeed the way to go. Several defconfig use the same Git repository. (e.g. 7 use linux-at91 and 7 use linux-2.6-imx). We need a clone to have a non-git identifier. I'd suggest to hash BR2_LINUX_KERNEL_CUSTOM_REPO_URL. sha1sum would give us the following paths:
"git://git.freescale.com/imx/linux-2.6-imx.git" # => linux-36a3f7006936f66cbf83b1de5bd179b2e72ceb4b.git "https://github.com/linux4sam/linux-at91.git" # => linux-75076bea97e59045a5cfc8d84078976952d751bf.git
We might not want to store the clones in the same directory as the ready-to-be-extracted sources, so maybe a DL_VCS_DIR can be introduced.
Thanks,
-v
PATCH 1/1 support/download: fetch all refs on full git clone
In reply to Arnout VandecappelleHello Arnout,
On Friday 13 November 2015 07:49:48 Arnout Vandecappelle wrote:
[...]
Quoted 10 lines
What I
think would make sense is that for distributed VCS downloads (i.e. git and hg) we keep a full (shallow) clone inDL_DIRin addition to the tarball. That makes handling updates a lot more efficient. We probably would want to expose that to PRIMARY and SECONDARY download sites as well. Especially the PRIMARY would be useful, since it would allow you to start from a local clone of e.g. linux.git (which may not have the ref you need), and then just fetch the missing refs from upstream.
Quoted 3 lines
This will not be easy to implement, though, since we'd need to handle
e.g. multiple remotes that end up in the same DL_DIR/foo.git repository.
For your information, I have in my drafts a patch which implement a similar idea. I think I would be able to send a first version in 1 or 2 weeks.
BR,
Signature · 3 lines
J?r?me Pouiller, Sysmic Embedded Linux specialist http://www.sysmic.fr
PATCH 1/1 support/download: fetch all refs on full git clone
In reply to Vivien DidelotVivien, All,
On 2015-11-12 11:12 -0500, Vivien Didelot spake thusly:
Quoted 77 lines · Maxime Hadjinlian
Quoted 31 lines
Quoted 28 lines · Vivien Didelot
When specifying
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION, a user may want to specify the SHA of a reference different than a branch or tag.For instance, Gerrit stores the patchsets under refs/changes/xx/xxx, and Github stores the pull requests under refs/pull/xxx/head.
When cloning a repository with --bare, you don't fetch these references. This patch uses --mirror for a full clone, in order to give the user access to all references of the Git repository.
Signed-off-by Vivien Didelot <[email protected]>--- support/download/git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)support/download/git +0
-0@@ -43,7 +43,7 @@ if [ -n "$(${GIT} ls-remote "${repo}" "${cset}" 2>&1)"]; then
fi
if [ ${git_done} -eq 0 ]; then
printf "Doing full clone\n"support/download/git +1
-1- ${GIT} clone ${verbose} --bare "${repo}" "${basename}" + ${GIT} clone ${verbose} --mirror "${repo}" "${basename}" fiQuoted 7 lines
Quoted 4 lines
GIT_DIR="${basename}" \
--
2.6.2I've read the different between bare and mirror and from what I understand, mirrors implies bare and also maps the remotes branch to the local branches.
Both maps source and target branches. But --mirror also maps *all* refs, i.e. any (standard) ref that is not a tag or a branch.
Quoted 10 lines
Given that understanding, I am afraid I don't really get what you are trying to do. From what I understand of Git, everything has a SHA ID, be it, branches, tags, merge commit, even when you push -f you still have access to previous state of your HEAD.
I cloned a repository from Github that had pull requests ongoing, I could not find anything non-standard under .git/refs/, is there a specific example that you could point to ? I don't know Gerrit nor how it works, so maybe this was the issues you had ?
Quoted 7 lines
Finally, with the current mechanisms, you can specify a SHA, so if you are trying to clone a PR, since it should be made from either a branch from the local repository, or a whole other repository, you should be able to specify it.
Again, I'm not sure I got what you were trying to do, maybe there's a special use cases with Gerrit that I'm not aware of.
Here's an example with Github:
$ git clone git at github.com:maximeh/leaflet.bouncemarker.git --bare /tmp/github.bare $ git -C /tmp/github.bare show refs/pull/24/head # => unknown revision $ git -C /tmp/github.bare show bd029a9ace8810259f73933894b665f5b0a5bb36 # => bad object$ git clone git at github.com:maximeh/leaflet.bouncemarker.git --mirror /tmp/github.mirror $ git -C /tmp/github.mirror show refs/pull/24/head $ git -C /tmp/github.mirror show bd029a9ace8810259f73933894b665f5b0a5bb36Now an example with Gerrit:
$ git clone https://gerrit-ring.savoirfairelinux.com/ring-lrc --bare /tmp/gerrit.bare $ git -C /tmp/gerrit.bare show refs/changes/62/2462/8 # => unknown revision $ git -C /tmp/gerrit.bare show 6f5cf35b6644b0de2a3e005805b25e6a91a429cb # => bad object
Quoted 6 lines
$ git clone https://gerrit-ring.savoirfairelinux.com/ring-lrc --mirror /tmp/gerrit.mirror $ git -C /tmp/gerrit.mirror show refs/changes/62/2462/8 $ git -C /tmp/gerrit.mirror show 6f5cf35b6644b0de2a3e005805b25e6a91a429cbWith a mirror clone you can specify the target version as either the SHA or the ref path.
Yes, but for PR, I'm afraid this is not very stable: one may re-push a PR, or one may delete it (e.g. the PR initiator may remove his tree and the PR is no longe ravailable. Or is it?).
Yet, those do not provide stable references, like sha1 and tags do provide.
I understand it can be interesting during development, though, to quickly test a PR without having to manually handle fetching it...
Regards,
Yann E. MORIN.
Signature · 6 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 223 225 172 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------'
PATCH 1/1 support/download: fetch all refs on full git clone
Hi Yann,
Quoted 91 lines · Yann E. MORIN
Vivien, All,
On 2015-11-12 11:12 -0500, Vivien Didelot spake thusly:
Quoted 77 lines · Maxime Hadjinlian
Quoted 31 lines
Quoted 28 lines · Vivien Didelot
When specifying
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION, a user may want to specify the SHA of a reference different than a branch or tag.For instance, Gerrit stores the patchsets under refs/changes/xx/xxx, and Github stores the pull requests under refs/pull/xxx/head.
When cloning a repository with --bare, you don't fetch these references. This patch uses --mirror for a full clone, in order to give the user access to all references of the Git repository.
Signed-off-by Vivien Didelot <[email protected]>--- support/download/git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)support/download/git +0
-0@@ -43,7 +43,7 @@ if [ -n "$(${GIT} ls-remote "${repo}" "${cset}" 2>&1)"]; then
fi
if [ ${git_done} -eq 0 ]; then
printf "Doing full clone\n"support/download/git +1
-1- ${GIT} clone ${verbose} --bare "${repo}" "${basename}" + ${GIT} clone ${verbose} --mirror "${repo}" "${basename}" fiQuoted 7 lines
Quoted 4 lines
GIT_DIR="${basename}" \
--
2.6.2I've read the different between bare and mirror and from what I understand, mirrors implies bare and also maps the remotes branch to the local branches.
Both maps source and target branches. But --mirror also maps *all* refs, i.e. any (standard) ref that is not a tag or a branch.
Quoted 10 lines
Given that understanding, I am afraid I don't really get what you are trying to do. From what I understand of Git, everything has a SHA ID, be it, branches, tags, merge commit, even when you push -f you still have access to previous state of your HEAD.
I cloned a repository from Github that had pull requests ongoing, I could not find anything non-standard under .git/refs/, is there a specific example that you could point to ? I don't know Gerrit nor how it works, so maybe this was the issues you had ?
Quoted 7 lines
Finally, with the current mechanisms, you can specify a SHA, so if you are trying to clone a PR, since it should be made from either a branch from the local repository, or a whole other repository, you should be able to specify it.
Again, I'm not sure I got what you were trying to do, maybe there's a special use cases with Gerrit that I'm not aware of.
Here's an example with Github:
$ git clone git at github.com:maximeh/leaflet.bouncemarker.git --bare /tmp/github.bare $ git -C /tmp/github.bare show refs/pull/24/head # => unknown revision $ git -C /tmp/github.bare show bd029a9ace8810259f73933894b665f5b0a5bb36 # => bad object$ git clone git at github.com:maximeh/leaflet.bouncemarker.git --mirror /tmp/github.mirror $ git -C /tmp/github.mirror show refs/pull/24/head $ git -C /tmp/github.mirror show bd029a9ace8810259f73933894b665f5b0a5bb36Now an example with Gerrit:
$ git clone https://gerrit-ring.savoirfairelinux.com/ring-lrc --bare /tmp/gerrit.bare $ git -C /tmp/gerrit.bare show refs/changes/62/2462/8 # => unknown revision $ git -C /tmp/gerrit.bare show 6f5cf35b6644b0de2a3e005805b25e6a91a429cb # => bad objectQuoted 6 lines
$ git clone https://gerrit-ring.savoirfairelinux.com/ring-lrc --mirror /tmp/gerrit.mirror $ git -C /tmp/gerrit.mirror show refs/changes/62/2462/8 $ git -C /tmp/gerrit.mirror show 6f5cf35b6644b0de2a3e005805b25e6a91a429cbWith a mirror clone you can specify the target version as either the SHA or the ref path.
Yes, but for PR, I'm afraid this is not very stable: one may re-push a PR, or one may delete it (e.g. the PR initiator may remove his tree and the PR is no longe ravailable. Or is it?).
Quoted 5 lines
Yet, those do not provide stable references, like sha1 and tags do provide.
I understand it can be interesting during development, though, to quickly test a PR without having to manually handle fetching it...
Github PR related blob goes into the target repository. I don't know if Github removes them if the PR is removed from the source repository.
But note that Github was just an example. However this fixes my build for an under-review Linux we have behind a Gerrit.
Thanks,
-v
PATCH 1/1 support/download: fetch all refs on full git clone
In reply to Vivien DidelotQuoted 11 lines · Vivien Didelot
When specifying
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION, a user may want to specify the SHA of a reference different than a branch or tag.For instance, Gerrit stores the patchsets under refs/changes/xx/xxx, and Github stores the pull requests under refs/pull/xxx/head.
When cloning a repository with --bare, you don't fetch these references. This patch uses --mirror for a full clone, in order to give the user access to all references of the Git repository.
Signed-off-by Vivien Didelot <[email protected]>
(I pasted Maxime's review here for clarity)
Guys, could you merge this patch please? Also having it applied as a fix for 2015.11 would be a plus.
Best,
-v
Thomas Petazzoni
AppliedPATCH 1/1 support/download: fetch all refs on full git clone
In reply to Vivien DidelotDear Vivien Didelot,
Quoted 6 lines · Vivien Didelot
When specifying
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION, a user may want to specify the SHA of a reference different than a branch or tag.For instance, Gerrit stores the patchsets under refs/changes/xx/xxx, and Github stores the pull requests under refs/pull/xxx/head.
Quoted 8 lines
When cloning a repository with --bare, you don't fetch these references. This patch uses --mirror for a full clone, in order to give the user access to all references of the Git repository.
Signed-off-by Vivien Didelot <[email protected]>--- support/download/git | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Applied to next, thanks.
Thomas
Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com